git update-index - 在目录上保持不变

时间:2012-09-05 19:10:58

标签: git command-line pipe

git 1.7.12

我想将给定目录下的所有文件标记为假设未更改。

1)git update-index --assume-unchaged dir/给出“忽略路径”。

2)git update-index --assume-unchaged dir/*很快失败,因为它会遇到未被跟踪的文件,因此它会“致命:无法标记文件”并退出。

3)尝试生成要标记的文件列表。 cd进入所需目录,然后运行git ls-files | tr '\n' ' ' | git update-index --assume-unchanged。这不会产生任何错误消息,但不会成功标记文件。命令的第一部分git ls-files | tr '\n' ' '正确生成了我想要标记的所有文件的空格分隔列表。如果我将该命令的输出复制并粘贴到命令行,则git update-index命令有效。什么不使用管道?

不,我将dir添加到.gitignore是不够的。我需要将这些文件放在存储库中,但是需要在本地进行不需要的更改,以便用户可以进行拉取。

4 个答案:

答案 0 :(得分:162)

git update-index希望文件名在其命令行上,而不是在其标准输入上。

第1步:

cd进入您要假设的文件夹

第2步:

你可以这样做:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

尽管如此,在任何一种情况下,带空格的文件名都会有问题。如果你有这些,你可以使用它:

git ls-files -z | xargs -0 git update-index --assume-unchanged

编辑:纳入@MatthewScharley关于git ls-files -z的输入。

Windows命令

  

注意:如果您使用的是Windows,请使用 Git Bash 来运行这些命令

答案 1 :(得分:20)

来自GNU Findutils的find命令有一个-exec选项,可以消除使用xargs的大部分麻烦,尽管它的语法有点特殊。但它确实与带有空格的文件名完美匹配。

这个命令将让git假设列出目录中和下面的所有文件都保持不变:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

查找在-exec之后的每个参数,直到;(你必须逃脱,以免你的shell吃掉它)并为找到的每个文件运行一次,同时替换{}(再次,使用找到的文件名称单引号,这样你的shell就不会吃了它。

使用find的匹配条件(最大递归深度,匹配是文件还是目录,文件名是否与表达式匹配)和-exec你可以做各种有力的事情

不确定find命令的其他实现。 YMMV。

答案 2 :(得分:11)

将目录名称添加到.git/info/exclude。这适用于未跟踪的文件。

答案 3 :(得分:0)

叶氏,

git update-index --assume-unchanged

仅适用于文件,不适用于目录。 我认为,更快的方法之一:

cd dir
ls | xargs -l git update-index --assume-unchanged