How do I checkout a sub direcotry in a huge git repo with specified branch and with sparse checkout?

for example, I want to get this folder https://github.com/python/cpython/tree/2.7/Tools/freeze

The command I ran was:

  • What's the most proper way to remove an already deleted branch from tab-completion history?
  • pipe is returning empty string in bash in git for windows
  • Klocwork Get the amount of issues in a provided build number
  • Can anyone explain, why “git status” touches the .git directory?
  • Git post-receive hook not working
  • Is it possible to write a script on a server side hook on github
  • mkdir python
    cd python
    git init
    git remote add origin https://github.com/python/cpython.git
    git config core.sparsecheckout true
    echo "Tools/freeze/*" >> .git/info/sparse-checkout
    
    # find remote branches
    git remote show origin
    
    # this works and pulls only that folder
    git pull --depth=1 origin master
    
    # but this doesn't, why?
    git pull --depth=1 origin 2.7
    
    # but how do I switch to remote 2.7 branch?
    git checkout --track -b 2.7 origin/2.7
    fatal: Cannot update paths and switch to branch '2.7' at the same time.
    Did you intend to checkout 'origin/2.7' which can not be resolved as commit?
    

    I read somewhere I need to run a git fetch before checkout, but it kind of defeat the purpose of sparse checkout, my internet is slow and repo is huge. How can I just get that subdirectory with branch 2.7 ? Thanks!

    This is on windows8 and git bash

    edit:
    if I ran
    git pull --depth=1 origin 2.7 it will pull remote 2.7 branch but it also brings every other files into my working directory, while if I ran git pull --depth=1 origin master, it only brings Tools/freeze directory in master branch ? why is this happening ?

    another example:

    mkdir qt
    cd qt
    git init
    git remote add origin https://github.com/qtproject/qt.git
    git config core.sparsecheckout true
    echo util/qlalr/examples/lambda/* >> .git/info/sparse-checkout
    git pull --depth=1 origin 4.8
    

    That folder util/qlalr/examples/lambda is very small, but when it run the last command, it is still slow, can this be avoided ?

    edit2: I realized that this is not possible with current git. but my only left question now is why git pull --depth=1 origin 2.7 doesn’t respect sparse checkout config?

  • Launch TestNG suite from bash script
  • Cannot merge in Gerrit
  • How to merge a specific commit in Git
  • How should I manage Test Harnesses in Git - Should they be in a separate repo?
  • Git push to refs/remotes/mine/master
  • Git: unable to redirect/parse the output of 'git fetch --dry-run' command
  • 3 Solutions collect form web for “How do I checkout a sub direcotry in a huge git repo with specified branch and with sparse checkout?”

    Your checkout failed because pulling (and hence fetching) an explicit ref fetches only that ref, so after your initial pull your repo had only refs/heads/master and refs/remotes/origin/master, both pointing at the same commit. Checkout of 2.7 didn’t work because your repo didn’t have anything by that name.

    Pull does a merge, and the extra content git pull origin 2.7 put in your worktree is there for conflict resolution, merge can’t determine the correct results so you have to. You’ll see that not everything outside the Tools directory is checked out, only the conflicted files. I’m not sure how merge with a shallow fetch and sparse checkout should behave overall, but asking for conflict resolution is surely the only thing to do here.

    Doing a shallow one-ref fetch is as lightweight as git gets, if one-off bandwidth use is really that dear you could clone to an ec2 instance and tag a particular tree.

    Try this

    mkdir 
    cd 
    git init
    git remote add -f origin <url>
    

    This creates an empty repository and fetches all objects but doesn’t check them out. Then do:

    git config core.sparseCheckout true
    

    Now define which folders you want. This is done adding it in.
    git/info/sparse-checkout,

    echo “some/dir/” >> .git/info/sparse-checkout echo “another/sub/tree” >> .git/info/sparse-checkout

    Then

    git pull origin master
    

    First of all set the config parameter:

    # Enable sparse-checkout:
    git config core.sparsecheckout true
    

    Configure sparse-checkout paths in .git/info/sparse-checkout:

    # Add the relevant path to the sparse-checkout file
    echo cpython/tree/2.7/Tools/freeze >> .git/info/sparse-checkout
    

    Update your working tree:

    git read-tree -mu HEAD
    

    git-read-tree
    Reads tree information into the index

    -m
    Perform a merge, not just a read

    -u
    After a successful merge, update the files in the work tree with the result of the merge.


    sparse checkout

    With sparse checkout you basically tell Git to exclude a certain set of files from the working tree.
    Those files will still be part of the repository but they won’t show up in your working directory.

    Internally, sparse checkout uses the skip-worktree flag to mark all the excluded files as always updated.

    # enable sparse checkout in an existing repository:
    git config core.sparseCheckout true
    
    # Create a .git/info/sparse-checkout file containing the
    # paths to include/exclude from your working directory. 
    
    # Update your working directory with 
    git read-tree -mu HEAD
    

    enter image description here

    Git Baby is a git and github fan, let's start git clone.