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

时间:2012-05-02 13:48:35

标签: git diff git-diff

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

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

14 个答案:

答案 0 :(得分:236)

Omg,驱动程序和awk排除糟糕的文件?由于git 1.9 something你可以:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'
啊,优雅!请参阅引用的答案以及@torek

的详细信息this answer

答案 1 :(得分:59)

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

使用此命令

创建特定于存储库的差异驱动程序
git config diff.nodiff.command /bin/true

或使用--global进行所有回购。

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

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

irrelevant.php    diff=nodiff

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

答案 2 :(得分:34)

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

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

答案 3 :(得分:17)

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

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

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

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

答案 4 :(得分:14)

此方法比接受的答案短。

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

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

答案 5 :(得分:6)

KurzedMetal对于我需要做的事情给出了很好的答案,即能够看到文件已更改,但不能生成差异(对于我而言这可能很大)。

但是我的一位同事建议使用更简单的方法为我工作:

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

file-not-to-diff.bin -diff

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

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

答案 6 :(得分:3)

在现有答案的基础上,如果要排除文件模式,无论文件模式在目录中的什么位置,请使用相应的**的{​​{3}}值:

git diff -- ':!**/yarn.lock'

答案 7 :(得分:1)

类似于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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

相对于git根目录

git diff接受可选的排除

git diff -- ":(exclude)thingToExclude"

您可能要添加一些通配符

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

目标特定文件类型

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

或为您的点文件删除一些脚本

例如.bash_profile.zshrc

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

答案 10 :(得分:1)

最简单的答案

git diff ':!db/irrelevant.php'

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

答案 11 :(得分:0)

如果你想这样做只是为了目视检查差异,一个视觉差异工具(如Meld)将允许你用一个容易记住的简短命令来做到这一点。

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

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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

答案 12 :(得分:0)

我执行以下操作:

git add *pattern_to_exclude*
git diff
git reset HEAD .

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

答案 13 :(得分: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