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

Want to exclude file from “git diff”

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

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


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

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

啊,优雅!请参阅引用的答案以及有关@torek的答案的详细信息


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

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

1
git config diff.nodiff.command /bin/true

或使用--global用于所有回购。

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

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

1
irrelevant.php    diff=nodiff

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


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

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


此方法比接受的答案短。

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

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


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

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

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

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


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

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

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

file-not-to-diff.bin -diff

仍然可以让git status"查看"文件是否更改。 git diff也将"看到"文件已更改,但不会生成diff

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


我执行以下操作:

1
2
3
git add *pattern_to_exclude*
git diff
git reset HEAD .

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


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

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

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

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

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

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

例子:

1
2
3
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

相对于git根目录

git diff接受可选的排除

1
git diff --":(exclude)thingToExclude"

您可能要添加一些通配符

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

定位特定文件类型

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

或为您的dotfile删除一些脚本

.bash_profile.zshrc

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


如果您只想在视觉上检查差异,则可以使用视觉差异工具(如Meld),通过简短的命令轻松记住它。

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

1
$ git config --global diff.tool = meld

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

1
$ git difftool --dir-diff

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