git clone, ignoring a directory

Git

Git Problem Overview


I'm trying to test something on a wordpress install. In doing so, I'd like to quickly replicate the repo. However, the upload directory (wp-content/uploads) is massive, so I'd like to ignore it.

Note: I don't want to .gitignore this directory all the time, just for this scenario.

Basically, I'd like a command like this pseudo code: git clone --ignore wp-content/uploads.

Is the best way to add that directory to .gitignore, clone, and then revert .gitignore? Or is there a better method?

Git Solutions


Solution 1 - Git

A bit late to the party, but: Don't you want a sparse checkout?

mkdir <repo> && cd <repo>
git init
git remote add –f <name> <url>

Enable sparse-checkout:

git config core.sparsecheckout true

Configure sparse-checkout by listing your desired sub-trees in .git/info/sparse-checkout:

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

Checkout from the remote:

git pull <remote> <branch>

See http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/ for more info.

Solution 2 - Git

git clone will always clone the complete repository*, including all previous commits ever added to the repository. So even if you remove the files temporarily, and clone it then, you will still receive the older versions which do contain those files.

Also, just editing the .gitignore will not remove tracked files from the repository even if they would normally be ignored.

So no, it is not really possible to skip a certain folder during cloning.

*It is possible to limit the amount of commits retrieved during a clone, but this will not make the repository very usable.

Solution 3 - Git

you can specify the depth to clone (--depth=1 to get only 1 commit). You may want to set up a branch with this directory missing and then clone with depth of one only. Since git is snapshot based, it's not easy to exclude a part of a commit when cloning. This is the closest to what you want.

If you have full control of this repo, you may want to make a submodule of this directory and only do a submodule update when you want to admin that part.

Solution 4 - Git

On the server:

 git checkout master^0    # the ^0 checks out the commit itself, not the branch
 git filter-branch --tree-filter 'git rm -r wp-content/uploads' HEAD
 git checkout -b filtered

(filter-branch on a big project here generates new history at about 2-3 commits per second)

Then, anywhere you like,

 git init
 git remote add gimme your://repo/path
 git fetch gimme filtered

edit: fixed syntax errors according to http://git-scm.com/docs/git-filter-branch

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionhookedonwinterView Question on Stackoverflow
Solution 1 - GitRogier van het SchipView Answer on Stackoverflow
Solution 2 - GitpokeView Answer on Stackoverflow
Solution 3 - GitAdam DymitrukView Answer on Stackoverflow
Solution 4 - GitjthillView Answer on Stackoverflow