323

我正在尝试db/irrelevant.php从 Git 差异中排除文件 ()。我尝试将一个文件放在使用该行db调用的子目录中, 并且我还尝试创建一个名为 contains 的文件。.gitattributesirrelevant.php -diff.git/info/attributesdb/irrelevant.php

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

4

14 回答 14

444

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

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

(在 Winodws 上,用'双引号替换单引号"。)

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

于 2016-10-09T12:40:04.857 回答
69

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

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

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命令(通过文档文件或其他东西)。

于 2012-05-02T20:43:41.890 回答
68

这种方法比接受的答案短。

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

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

于 2018-01-15T08:30:09.477 回答
45

最简单的答案

git diff ':!db/irrelevant.php'

':!<path>'在您的 diff 命令之后。diff 命令可以随心所欲地复杂化,如果需要,您可以使用通配符*.min.js或添加多个排除项(用空格分隔引用的块)。

于 2019-11-13T21:07:23.253 回答
39

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

git diff | filterdiff -p 1 -x db/irrelevant.php
于 2012-05-02T18:00:27.030 回答
26

KurzedMetal对我需要做的事情给出了非常好的回答,即能够看到文件已更改,但不能生成差异,在我的情况下,差异可能很大。

但我的一位同事提出了更简单且对我有用的方法:

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

file-not-to-diff.bin -diff

这仍然可以让git status“查看”文件是否更改。git diff还将“看到”文件已更改,但不会生成diff.

.bin示例中文件的扩展名是故意的。我确实意识到这是 git 对二进制文件的默认行为,它不需要对.gitattributes. 但在我的情况下,这些文件被 git 和“文件”实用程序识别为文本文件,这就成功了。

于 2018-12-20T17:30:58.873 回答
16

这种单线解决方案不需要其他实用程序/下载:

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

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

编辑:感谢 ksenzee修复了破坏差异的已删除文件。

于 2012-05-02T20:45:38.803 回答
11

相对于git根目录

git diff接受可选的排除

git diff -- ":(exclude)thingToExclude"

您可能想要添加一些通配符

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

针对特定文件类型

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

或者为您的 dotfiles 放置一个小脚本

比如.bash_profile.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}
于 2019-09-11T15:56:35.187 回答
7

在现有答案的基础上,如果您想排除文件模式,无论它在目录中的什么位置,请使用相应的git pathspec**

git diff -- ':!**/yarn.lock'
于 2020-07-26T00:42:33.133 回答
2

这很简单,您可以使用标准的 unix 命令排除您想要的内容,即使在 windows 环境下,这些命令也可以在 git bash 下使用。下面的示例显示了如何排除 pom.xml 文件的差异,首先检查 diff to master 仅用于文件名,然后使用 'grep -v' 排除您不想要的文件,然后再次运行 diff to master 并使用准备好的列表:

git diff master `git diff --name-only master | grep -v pom.xml`
于 2019-04-16T14:27:01.470 回答
2

我执行以下操作:

git add *pattern_to_exclude*
git diff
git reset HEAD .

我知道这不是一个优雅的解决方案,有时无法使用(例如,如果您已经准备好东西),但它可以解决问题,而无需输入复杂的命令

于 2019-05-28T14:48:29.837 回答
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
于 2016-09-11T03:08:57.873 回答
0

如果您只想通过目视检查差异来执行此操作,则可视差异工具(如Meld)将让您使用易于记忆的简短命令完成此操作。

首先,如果您还没有设置差异工具。

$ git config --global diff.tool = meld

然后,您可以运行目录差异。

$ git difftool --dir-diff

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

于 2018-02-06T20:41:01.997 回答
0
git diff remote/master..master --name-only -- ':!README.rst'

给我(git 版本 2.11.0)

fatal: There is nothing to exclude from by :(exclude) patterns.
Perhaps you forgot to add either ':/' or '.' ?
git diff remote/master..master --name-only -- './*' ':!README.rst'

工作得很好,来源:https ://stackoverflow.com/a/30084612/5155484

于 2021-06-17T12:58:11.357 回答