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

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


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

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

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

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

git config diff.nodiff.command /bin/true

或者是你所有的,全球回购。

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

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

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上,将单引号'替换为双引号'。)

啊,优雅!请参阅引用的答案和@torek的回答


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

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

要了解更多关于不同的包含/排除可能性的信息,请阅读另一篇文章


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

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

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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


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

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

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

file-not-to-diff.bin选项

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

示例中文件的扩展名是.bin。我知道这是二进制文件git的默认行为,它不需要用.gitattributes进行特殊处理。但在我的例子中,这些文件被git和“file”实用程序识别为文本文件,这就完成了任务。


这很简单,你可以使用标准的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接受一个可选的排除

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路径spec值**:

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