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是不够的。我需要将这些文件放在存储库中,但是需要在本地进行不需要的更改,以便用户可以进行拉取。
答案 0 :(得分:162)
git update-index
希望文件名在其命令行上,而不是在其标准输入上。
cd
进入您要假设的文件夹
你可以这样做:
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,请使用 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