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

问题描述 投票:167回答:9

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

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

git diff git-diff
9个回答
246
投票

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

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

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


0
投票

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

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

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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


60
投票

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

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

git config diff.nodiff.command /bin/true

或者与--global的所有回购。

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

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

irrelevant.php    diff=nodiff

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


34
投票

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

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

19
投票

此方法比接受的答案短。

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

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


17
投票

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

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

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

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


6
投票

KurzedMetal真的很好的回答我需要做的事情,这是能够看到文件已经改变,但不能生成差异,这可能是巨大的,在我的情况下。

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

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

file-not-to-diff.bin -diff

这仍然让git status“看到”文件是否更改。 git diff也将“看到”该文件发生了变化,但它不会生成diff

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


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

1
投票

这很简单,你可以使用标准的unix命令排除你想要的东西,即使在windows环境下,这些命令也可以在git bash下使用。下面的示例显示了如何为pom.xml文件排除diff,首先将diff检查为仅用于文件名的master,然后使用'grep -v'排除您不想要的文件,然后使用prepapred list再次运行diff到master:

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

1
投票

我做以下事情:

git add *pattern_to_exclude*
git diff
git reset HEAD .

我知道它不是一个优雅的解决方案,它有时不能使用(例如,如果你已经有阶段),但它可以做到这一点,而无需输入复杂的命令

© www.soinside.com 2019 - 2024. All rights reserved.