Is it possible to do a sparse checkout without checking out the whole repository first?
Please note that this answer does download a complete copy of the data from a repository. The git remote add -f
command will clone the whole repository. From the man page of git-remote
:
With
-f
option,git fetch <name>
is run immediately after the remote information is set up.
Try this:
mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master
Now you will find that you have a "pruned" checkout with only files from path/within_repo/to/desired_subdir present (and in that path).
Note that on windows command line you must not quote the path, i.e. you must change the 6th command with this one:
echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout
if you don't you'll get the quotes in the sparse-checkout file, and it will not work
Git clone has an option (--no-checkout
or -n
) that does what you want.
In your list of commands, just change:
git clone <path>
To this:
git clone --no-checkout <path>
You can then use the sparse checkout as stated in the question.
In 2020 there is a simpler way to deal with sparse-checkout without having to worry about .git files. Here is how I did it:
git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull
Note that it requires git version 2.25 installed. Read more about it here: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
UPDATE:
The above git clone
command will still clone the repo with its full history, though without checking the files out. If you don't need the full history, you can add --depth parameter to the command, like this:
# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1