简体   繁体   中英

git clone, ignoring a directory

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?

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.

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.

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.

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

I feel the previous answers are too complicated to me. So I forked the github repo and deleted the directory. Then I downloaded my fork's zip directly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM