排除文件从"git差异"

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

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

130576 次浏览

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

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

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

创建一个特定于存储库的差异驱动程序

git config diff.nodiff.command /bin/true

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

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

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

irrelevant.php    diff=nodiff

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

这个单行解决方案不需要其他utils/downloads:

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

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

编辑:credit ksenzee用于修复破坏差异的已删除文件。

类似于本面粉糊的解决方案,但无论如何共享:

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

天哪,驱动程序和awk排除一个糟糕的文件?因为Git 1.9之类的你可以:

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

(在Windows上,将单引号'替换为双引号"。)

啊,优雅!参见引用的答案和详细信息这个答案 by @torek

这种方法比公认的答案更短。

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

有关不同的包含/排除可能性的更多信息,请阅读这是另一篇文章

如果你想这样做只是为了直观地检查diff,一个可视化的diff工具(如融合)会让你用一个容易记住的简短命令来做。

首先,设置一个差异工具(如果你还没有的话)。

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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

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

但我的一个同事提出了一个更简单的方法,对我来说很有效:

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

file-not-to-diff.bin -diff

那还是让git status "see"如果文件改变了。git diff也将"see"但是它不会生成diff. xml文件。

示例中文件的.bin扩展名是经过深思熟虑的。我确实意识到这是二进制文件git的默认行为,它不需要特殊处理.gitattributes。但在我的情况下,这些文件被git识别为文本文件和“文件”;效用,这就成功了。

这很简单,你可以使用标准的unix命令排除你想要的,这些命令在git bash下甚至在windows环境下都是可用的。 下面的例子展示了如何排除pom.xml文件的diff,首先检查diff只对文件名进行master,然后使用'grep -v'排除你不想要的文件,然后使用prepared list再次运行diff来master:

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

我做以下事情:

git add *pattern_to_exclude*
git diff
git reset HEAD .

我知道这不是一个优雅的解决方案,它有时不能被使用(例如。如果你已经把东西准备好了),但它不需要输入复杂的命令就能完成任务

相对于git根目录

git diff接受可选的exclude

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/*"
}

简单的回答

git diff ':!db/irrelevant.php'

它只是在你的diff命令之后的':!<path>'。diff命令可以像你喜欢的那样复杂,如果你愿意,你可以使用像*.min.js这样的通配符,或者添加多个排除符(用空格分隔引号块)。

在现有答案的基础上,如果你想排除一个文件模式,无论它在目录中的哪个位置,请使用**对应的git pathspec值:

git diff -- ':!**/yarn.lock'
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

我的解决方案

git add .
git reset <list of files to ignore>
git diff --cached