`git diff --stat` 排除特定文件。

34
我正在尝试根据从“git diff”中排除文件的答案来适应--stat标志,但失败了。被接受的回答(创建驱动程序)似乎仅适用于Unix系统(重定向到/bin/true,无论这意味着什么),而且它会创建一个驱动程序并将其永久地分配给该文件;而我正在寻找一个开关来暂时禁用某个文件(或者某些文件)的差异。

脚本解决方案如下:
git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

实际上调用了git status并编辑其输出 - 而我想要的是指示git diff本身在计算简单的--stat(仅有变更行数)时忽略某些文件。我查看了git-diff文档,但似乎找不到这样的选项。有人能帮帮我吗?
$ git --version
git version 2.6.1.windows.1
1个回答

73

Making 'git log' ignore changes for certain paths中描述的排除路径规范技巧,在这里适用:

git diff --stat -- . ':(exclude)file/to/exclude.txt'

或者,如果您在子目录中:

git diff --stat -- :/ ':(exclude,top)file/to/exclude.txt'

后者可以用不同的方式拼写。例如,这个也可以:

git diff --stat ':(top)' :!/file/to/exclude.txt

与之类似的是:

git diff --stat :/: :!/:file/to/exclude.txt

这些在“路径规范”部分下的gitglossary文档中有描述。请注意,排除功能是Git版本1.9中新增的(在1.9.2之前略有缺陷)。前导符号“/”是“top”的别名,“!”是“exclude”的别名,长形式需要括号。在使用单字符别名时,实际路径名之前的冒号是可选的,但在使用括号时是禁止的(这个规则每次都让我困扰——我总是想使用:(exclude):...而不是:(exclude)...)。上面的(top)(exclude)路径规范组件周围的单引号是为了保护这些括号不被(Unix/Linux)shell解释;Windows shell可能对需要保护的字符有不同的看法。

你是我的 Git 英雄!在 git bash shell 中为我工作(不是 cmd 或 power shell,只是带有 msysgit 的原始 shell,基于 mingwin)。命令是:git diff --stat 307-first-commit -- :/ ':(exclude,top)Mopy/Docs' ':(exclude,top)Mopy/bash/images',其中 "307-first-commit" 是一个标签。这个命令:git diff --stat 307-first-commit :/: :!/Mopy/Docs 不起作用(输出 "bash: !/Mopy/Docs: event not found")。这个命令 git diff --stat 307-first-commit :/: :!/:Mopy/Docs 也失败了,输出 "bash: !/: event not found"。 - Mr_and_Mrs_D
3
event not found是因为bash试图将!用于自己的目的。单引号或前缀反斜杠(但不是双引号)将保护!免受shell的影响。请注意,一般情况下shell还喜欢吞噬引号(用于保护其他字符)、星号、问号、尖括号和方括号,有些shell甚至会吞噬花括号。单引号是“最强大”的引号,可以引用除单引号以外的所有内容,而双引号是“最弱”的引号,但可以引用单引号。因此,'!?<'"'"可以传递四个字符! - torek
1
在Windows上,请使用双引号而不是单引号:git diff --status -- . ":(exclude)file/to/exclude.txt" - cnlevy
1
@misolo:是的,路径规范适用于git diff - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接