想要从“ git diff”中排除文件


228

我正在尝试db/irrelevant.php从Git差异中排除文件()。我尝试将文件放在该行所在的db子目录中.gitattributesirrelevant.php -diff 还尝试创建一个名为.git/info/attributes包含的文件db/irrelevant.php

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

Answers:


324

天哪,驱动程序和awk排除了糟糕的文件?从git 1.9开始,您可以:

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

啊,优雅!见引用答案和细节这个答案由@torek


3
注意:如果要排除特定的文件名,则必须以星号作为前缀,与.gitignore文件语法不同。例如,:!*shrinkwrap.yaml而不是:!shrinkwrap.yaml
vaughan

7
排除更多文件,例如,我有* .min.css和* .min.js文件,以避免git diff。因此,我使用命令git diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare,2018年

4
Windows语法:(用git diff -- . ":(exclude)db/irrelevant.php"双引号代替单引号)
cnlevy

4
谢谢!如此深奥的语法..我每次都要查一下。
丹尼尔·沃尔特里普

1
@cnlevy或无引号!git diff -- . :(exclude)db/irrelevant.php
Matthias

62

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

使用此命令创建存储库特定的差异驱动程序

git config diff.nodiff.command /bin/true

或与您的所有回购--global

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

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

irrelevant.php    diff=nodiff

如果应该将此状态与其他开发人员共享,则可以使用该状态,.gitattributes而不是与他人(通过文档文件或其他文件).git/info/attributes共享git config命令。


2
这正是我想要的-如kerneltrap.org/mailarchive/git/2008/10/17/3711254中所述,我编辑〜/ .gitconfig并添加: [diff "nodiff"] `command = / bin / true`,然后创建了一个名为我在其中添加的.git / info / attributes: irrelevant.php diff=nodiff
Michael

12
这个答案很多工作更好地为我:stackoverflow.com/questions/1016798/...
尼尔·福里斯特

3
有趣的是,这种方法不适用于git diff --stat。在这种情况下,可以将其git diff ... | diffstat用作解决方法。
ddkilzer

@Michael链接似乎很烦,还有另一个吗?
DickieBoy 2015年

3
只是一个补充:如果您仍然要强制git diff显示它,请使用--no-ext-diff
Florian Klein

35

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

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

4
请注意-p,在联机帮助页(1)中,“-pn,--strip-match = n匹配时,请忽略路径名的前n个组成部分”。我花了一段时间才发现-p 1正在db从OP的路径中删除该零件。如果您只想指定文件名而忽略所有路径/目录,则可以使用-p 99
Tyler Collier 2014年

32

此方法比接受的答案短。

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

有关不同包含/排除可能性的更多信息,请阅读此其他文章


请注意,过滤器仅适用于当前目录下的所有文件。
Chiel 10 Brinke

这是最好的答案。我能够进一步简化它:stackoverflow.com/a/58845608/3886183
dlsso

2
我将删除--stat部分,或者至少解释一下它的作用,因为没有其他答案包含它。
mix3d

stat标志向您显示文件及其差异总计,这使您可以轻松地检查过滤器是否按预期的方式工作。
Chiel十Brinke

17

这一单线解决方案不需要其他工具/下载:

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

file/to/exclude.txt当然,您要排除的文件名在哪里。

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


我正在尝试使您的一支班轮适应git diff --stat master不成功-您能帮上忙吗?
Mr_and_Mrs_D

13

对于我需要做的事情,KurzedMetal确实提供了很好的答案,即能够查看文件已更改,但不能生成差异(对于我而言,这可能是巨大的)。

但是我的一位同事建议的方法更加简单,并且为我工作:

.gitattributes在要忽略的文件所在的目录中添加文件git diff的内容如下:

file-not-to-diff.bin -diff

git status如果文件已更改,仍然可以“查看”。git diff也会“看到”文件已更改,但不会生成diff

.bin扩展了该示例中的文件是经过深思熟虑的。我确实意识到这是git对于二进制文件的默认行为,并且不需要使用进行特殊处理.gitattributes。但是在我的情况下,这些文件被git和“ file”实用程序识别为文本文件,并且达到了目的。


11

最简单的答案

git diff ':!db/irrelevant.php'

':!<path to file>'在您的diff命令之后。diff命令可以很复杂,也可以使用类似的通配符,也可以根据需要*.min.js添加多个排除(用引号引起来的块之间用空格隔开)。


5

相对于git根目录

git diff 接受可选的排除

git diff -- ":(exclude)thingToExclude"

您可能要添加一些通配符

git diff -- ":(exclude)*/thingToExclude/*"

定位特定文件类型

git diff -- ":(exclude)*/$1/*.png"

或为您的dotfile删除一个小脚本

.bash_profile.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}

这对我不起作用,使用(exclude)或!两种语法,我一点都没有区别。我有git 2.21.0
Olivvv

您可以git diff未暂存或暂存的文件。如果您添加了git,它们就会上演。如果他们上演,您可以做,git diff --staged希望对您有帮助。
jasonleonhard

语法上,冒号在做什么?
约拿

2

非常简单,您可以使用标准的unix命令排除所需的内容,即使在Windows环境下,这些命令也可以在git bash下使用。下面的示例显示了如何排除pom.xml文件的diff,首先检查diff仅对文件名进行区分,然后使用'grep -v'排除不需要的文件,然后再次运行preprepred列表对diff进行掌握:

git diff master `git diff --name-only master | grep -v pom.xml`

1

Ben Roux的解决方案相似,但仍然可以共享:

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

1

我执行以下操作:

git add *pattern_to_exclude*
git diff
git reset HEAD .

我知道这不是一个很好的解决方案,有时可以使用它(例如,如果您已经上演了东西),但是它可以完成技巧而不必键入复杂的命令


0

如果您只想在视觉上检查差异,则可以使用视觉差异工具(如Meld)通过简单易记的简短命令来完成。

首先,如果还没有,请设置一个差异工具。

$ git config --global diff.tool = meld

然后,您可以运行目录diff。

$ git difftool --dir-diff

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.