git clone,忽略一个目录

时间:2013-01-14 20:47:09

标签: git

我正在尝试在wordpress安装上测试一些东西。在这样做的时候,我想快速复制回购。但是,上传目录(wp-content/uploads)非常庞大,所以我想忽略它。

注意:我不想一直.gitignore这个目录,只是为了这个场景。

基本上,我想要一个像这个伪代码的命令:git clone --ignore wp-content/uploads

将该目录添加到.gitignore,克隆,然后恢复.gitignore是最好的方法吗?或者有更好的方法吗?

4 个答案:

答案 0 :(得分:10)

派对有点晚了,但是:你不想要一个稀疏的结账吗?

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

启用稀疏结帐:

git config core.sparsecheckout true

通过在.git / info / sparse-checkout中列出您想要的子树来配置稀疏结账:

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

从遥控器结帐:

git pull <remote> <branch>

有关详细信息,请参阅http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/

答案 1 :(得分:6)

git clone将始终克隆完整存储库*,包括之前添加到存储库的所有提交。因此,即使您暂时删除文件并将其克隆,您仍然会收到包含这些文件的旧版本。

此外,只需编辑.gitignore即可删除存储库中的跟踪文件,即使它们通常会被忽略。

所以不,在克隆过程中不可能跳过某个文件夹。

*可以限制克隆期间检索的提交量,但这不会使存储库非常有用。

答案 2 :(得分:5)

您可以指定克隆的深度(--depth=1仅获得1次提交)。您可能希望设置缺少此目录的分支,然后仅使用深度为1进行克隆。由于git是基于快照的,因此在克隆时排除部分提交并不容易。这是你最接近你想要的。

如果您完全控制此仓库,则可能需要创建此目录的子模块,并且只在要管理该部件时才执行子模块更新。

答案 3 :(得分:3)

在服务器上:

 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在每秒约2-3次提交时生成新的历史记录)

然后,在任何你喜欢的地方,

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

修改:根据http://git-scm.com/docs/git-filter-branch

修复了语法错误