2012-05-02 252 views
100

我想从Git diff中排除文件(db/irrelevant.php)。我试图把文件放在db的子目录.gitattributes与行irrelevant.php -diff 我也试过创建一个名为.git/info/attributes包含db/irrelevant.php的文件。想要从“git diff”中排除文件

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

回答

93

OMG,司机并awk排除糟糕的文件?由于git 1.9 something您可以:

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

啊,优雅!请参阅引用的答案和详细信息this answer by @torek

+5

如果我需要排除多个文件,该怎么办? – itsashis4u

+4

@ itsashis4u'git diff - 。 ':(exclude)db/irrelevant.php'':(排除)db/another_irrelevant.php'' – tokland

+0

注意:如果你想排除一个特定的文件名,你必须以星号作为前缀,与'.gitignore'文件不同句法。例如。 ':!* shrinkwrap.yaml'而不是':!shrinkwrap.yaml'。 – vaughan

30

您还可以使用patchutils程序集合的filterdiff程序来排除某些差异的某些部分。例如:

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

请注意,来自手册页(1)的'-p'是“-p n,--strip-match = n匹配时,忽略路径名的前n个组件。”我花了一段时间才发现'-p 1'正在从OP的路径中删除'db'部分。如果你只是想指定一个文件名并忽略所有路径/目录的可能性,你可以使用'-p 99'。 –

51

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

使用此命令

git config diff.nodiff.command /bin/true 

或所有回购与--global创建一个存储库的具体差异驱动

(如果/bin/true在MacOS中不存在,替代品将使用/usr/bin/trueecho)。

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

irrelevant.php diff=nodiff 

如果这种状态应该与您可以使用.gitattributes代替.git/info/attributes并分享与您同行的git config命令(通过一个文档文件或东西),其他开发人员共享。

+2

这正是我一直在寻找 - 在http://kerneltrap.org/mailarchive/git/2008/10/17/3711254描述我编辑 〜/的.gitconfig 补充说: '[DIFF “nodiff”]' '命令=​​/bin中/ TRUE' 然后我创建了一个名为git的/ info文件/属性到了我说: 'irrelevant.php差异= nodiff' – Michael

+8

这个答案的工作更好对我来说:http://stackoverflow.com/questions/1016798/excluding-files-from-git-diff –

+3

有趣的是,这种方法不适用'git diff --stat'。在这种情况下,可以使用'git diff ... |作为一种解决方法,diffstat'。 – ddkilzer

17

这一个在线解决方案不需要其他utils的/下载:

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

哪里file/to/exclude.txt是你想排除当然,文件的名称。

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

+0

我正在尝试将你的一个班轮调整为'git diff --stat master'而没有太大的成功 - 你能帮忙吗? –

0

类似Ben Roux's的解决方案,但无论如何分享:

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 
2

此方法比可接受的anwer更短。

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs' 

有关不同的包含/排除的可能性更多信息,请阅读this other post

0

如果你想这样做,只是目测检查差异,视觉差异的工具(如Meld)将让你做到这一点一个简单的命令,很容易记住。

首先,建立一个diff工具,如果你还没有。

$ git config --global diff.tool = meld 

然后,你可以运行一个目录diff。

$ git difftool --dir-diff 

您将能够浏览Meld(或您选择的工具)中的差异(通过文件)。只是不要打开你想忽略的文件。