114

混帐 1.7.12

我想将给定目录下的所有文件标记为假设不变。

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

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

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

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

4

4 回答 4

198

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运行这些命令

于 2012-09-05T20:03:36.997 回答
27

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

此命令将使 git 假定列出的目录中和下的所有文件都未更改:

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

Find 接受-execuntil之后的每个参数;(您必须转义以免您的外壳吃掉它)并为找到的每个文件运行一次,同时用{}找到的文件名替换(再次单引号,这样您的外壳就不会吃掉它)。

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

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

于 2013-08-07T18:56:21.060 回答
25

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

于 2015-10-06T13:06:13.400 回答
3

Yeap,

git update-index --assume-unchanged

works with files only, not with directories. I think, one of faster ways:

cd dir
ls | xargs -l git update-index --assume-unchanged
于 2013-05-17T14:11:17.040 回答