-
-
Save sumardi/5559896 to your computer and use it in GitHub Desktop.
# New repository | |
mkdir <repo> && cd <repo> | |
git init | |
git remote add –f <name> <url> | |
git config core.sparsecheckout true | |
echo some/dir/ >> .git/info/sparse-checkout | |
echo another/sub/tree >> .git/info/sparse-checkout | |
git pull <remote> <branch> | |
# Existing repository | |
git config core.sparsecheckout true | |
echo some/dir/ >> .git/info/sparse-checkout | |
echo another/sub/tree >> .git/info/sparse-checkout | |
git read-tree -mu HEAD | |
# If you later decide to change which directories you would like checked out, | |
# simply edit the sparse-checkout file and run git read-tree again as above. | |
# http://schacon.github.io/git/git-read-tree.html#_sparse_checkout |
echo some/dir/ >> .git/info/sparse-checkout
echo another/sub/tree >> .git/info/sparse-checkout
explain above lines i can't understand
>>
means append to a file on the right text from echo command on the left
.git/info/sparse-checkout
is a configuration file for your sparse checkout (you can use some GUI text editor if you prefer and then skip the lines with echo
)
Beware of that bad dash in –f
: –
should be -
.
1st I tried the "# New repository" script, but got "fatal: refusing to merge unrelated histories". Then, realizing I was using an existing repository, tried the "# Existing repository" script, but that got "error: Sparse checkout leaves no entry on working directory" and nothing
changed in the working directory. Please, what's wrong?
A trick that people sometimes may ignore is that the "path" that you write into .git/info/sparse-checkout file is not exactly copied from the URL in browser. For example, I want to pull folder moodle-scalable-cluster-ubuntu from the URL https://github.com/Azure/azure-quickstart-templates/tree/master/moodle-scalable-cluster-ubuntu, then just put "moodle-scalable-cluster-ubuntu" or "moodle-scalable-cluster-ubuntu/" or "moodle-scalable-cluster-ubuntu/*" into the sparse-checkout file. Do NOT add some prefix like "/tree/master/".
Another thing that might help is to remove the CRLF in the end of each line of the sparse-checkout file. I didn't have any problem with that myself but someone said it's a trick for them.
It seems you miss one step:
git config core.sparsecheckout true
Windows users be aware! The echo command in powershell and cmd creates the '.git/info/sparse-checkout' file with a weird "UCS-2 LE BOM" encoding (according to the notepad++ editor).
But git needs an encoding like "UTF-8", "UTF-8 BOM" or "ascii". Otherwise it won't download any directories and fails with a "error: Sparse checkout leaves no entry on working directory" error.
You can change that with notepad++ or use the out-file powershell command:
echo some/subdir/ | out-file -encoding utf8 .\.git\info\sparse-checkout
To add new lines to the existing file use the '-Append' option of the out-file command:
echo some/subdir2/ | out-file -encoding -append utf8 .\.git\info\sparse-checkout
to specify what should not be checked out you can use the following pattern:
/*
!some_unwanted_directory/
reference: https://git-scm.com/docs/git-read-tree#_sparse_checkout
the .git folder is still very large after performing the Existing repository script. How to fix?
@zhaox27-medtronic, a sparse checkout doesn't affect how much commit history is cloned into the .git
folder, only how much is checked out into the current worktree.
To limit the size of .git
folder you can change the depth that you clone/fetch (the depth is the number of commit history you download).
See git-fetch and look at the --depth
flag.
if I use like this command line
echo some/dir/ >> .git/info/sparse-checkout
there will be a folder which names some ,
how could I set command that not produce this folder
#This way will work. Please note the space between each path.
git init
git config core.sparsecheckout true
echo 'some/dir/' 'another/sub/tree/'| out-file -encoding ascii .git/info/sparse-checkout
@ManfredBartz , @gadmyth: Which version of git were you using?