Pick only subset of folders when using Git clone

What you want is possible since Git 1.7 with what is called sparse-checkout.

A good explanation is found here.


Here's a modern approach to git sparse checkout

git clone --no-checkout <REPOSITORY> <DIR>
cd <DIR>
git sparse-checkout init --cone  # checkout root dir files (build, etc.)
git sparse-checkout set <SUBDIR1> [<SUBDIR2> ...] # subdir list to include
git checkout

See git documentation and GitHub blog post.


As the comment suggests, you can't clone part of a path. If you are used to different source control paradigms such as the one used by subversion, this may seem unintuitive at first. The reason you can't do it is because git stores snapshots of the whole tree. So you can get a shallow clone, meaning you get only recent history up to a point. This is more like a horizontal slice or cut-off, rather than the vertical one you are after.

The best way to get what you want is to use submodules. If you already have everything in one repository, you would have to either start fresh with this paradigm or tease apart the repository into multiple repositories with filter-branch. This would also be tricky as you would end up with empty commits in all repos and if get rid of those, you would have some tricky follow up filter branching to tie the proper commits in the submodule to the parent repository.

Take a look at the chapter on submodules at http://git-scm.com/book.