要从“git diff”中排除文件

我想从一个Git diff中排除一个文件( db/irrelevant.php )。 我试图把一个文件放在名为.gitattributesdb子目录中,用irrelevant.php -diff .gitattributes这一行,我也尝试创build一个名为.git/info/attributes的文件,其中包含db/irrelevant.php

在所有情况下, db/irrelevant.php文件作为Git二进制补丁包含在diff中。 我想要的是该文件的更改被diff命令忽略。 我究竟做错了什么?

Omg,驱动程序和awk排除糟糕的文件? 因为git 1.9的东西你可以:

 git diff -- . ':(exclude)db/irrelevant.php' 

啊,优雅! 请参阅引用的答案和@torek的答案

您可以使用no op命令设置自定义diff驱动程序,并将其分配给应忽略的文件。

使用此命令创build一个存储库特定的diff驱动程序

 git config diff.nodiff.command /bin/true 

或者--global所有的回购。

(如果MacOS中不存在/bin/true则可以使用/usr/bin/trueecho )。

然后,将新的diff驱动程序分配给要.git/info/attributes文件中忽略的文件。

 irrelevant.php diff=nodiff 

如果这个状态应该与其他开发者共享,你可以使用.gitattributes而不是.git/info/attributes并与你的同行共享git config命令(通过文档文件或者其他)。

您也可以使用patchutils程序集的filterdiff程序来排除diff的某些部分。 例如:

 git diff | filterdiff -p 1 -x db/irrelevant.php 

这种单线解决scheme不需要其他的使用/下载:

 git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-` 

其中file/to/exclude.txt是您想要排除的文件的名称,当然。

编辑:信用ksenzee修复删除的文件打破差异。

类似于Ben Roux的解决scheme,但无论如何共享:

 git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff 

或者,如果更改已经在本地提交:

 git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master 

例子:

 git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master git diff --name-only origin/master | grep -v docs | xargs git diff origin/master