从“git diff”中排除文件

问题描述 投票:0回答:15

我正在尝试从 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
15个回答
564
投票

天啊,驱动程序和

awk
排除一个糟糕的文件?从Git 1.9 开始你可以:

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

(在 Windows 上,将单引号

'
替换为双引号
"
。)

啊,优雅!请参阅引用的答案和详细信息这个答案,作者:@torek。


141
投票

此方法比接受的答案短。

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

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


85
投票

最简单的答案

git diff ':!db/irrelevant.php'

它就在 diff 命令之后的

':!<path>'
处。 diff 命令可以像您喜欢的那样复杂,并且您可以根据需要使用通配符,例如
*.min.js
或添加多个排除(用空格分隔引用的块)。


79
投票

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

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

git config diff.nodiff.command /bin/true

或使用

--global

 获取所有存储库。

(如果

/bin/true

 在 MacOS 中不存在,替代方案将使用 
/usr/bin/true
echo
)。

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


irrelevant.php diff=nodiff

如果要与其他开发人员共享此状态,您可以使用 
.gitattributes

而不是

.git/info/attributes
并与同行共享
git config
命令(通过文档文件或其他方式)。
    


40
投票
patchutils

程序集合中的 filterdiff 程序来排除差异的某些部分。例如: git diff | filterdiff -p 1 -x db/irrelevant.php



37
投票
KurzedMetal

的回答非常好,能够看到文件已更改,但不能生成差异,在我的情况下,差异可能会很大。 但是我的一位同事建议了一种更简单并且对我有用的方法:

.gitattributes

要忽略的文件所在目录中添加

git diff
文件,内容如下:

file-not-to-diff.bin -diff

仍然可以让 

git status

“查看”文件是否发生更改。

git diff
也会“看到”文件已更改,但不会生成
diff
示例中文件的 

.bin

扩展名是故意的。我确实意识到这是 git 对于二进制文件的默认行为,并且不需要使用

.gitattributes
进行特殊处理。但就我而言,这些文件被 git 和“文件”实用程序识别为文本文件,这就成功了。
    


15
投票

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

其中 
file/to/exclude.txt

当然是您要排除的文件的名称。


编辑:感谢

ksenzee

修复了破坏差异的已删除文件。


12
投票

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



8
投票
**

相应的 git pathspec 值:

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



3
投票

git add *pattern_to_exclude* git diff git reset HEAD .

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


2
投票

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



2
投票

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



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



0
投票
Meld

)可以让您使用易于记住的简短命令来完成此操作。 首先,如果您还没有设置一个差异工具。

$ git config --global diff.tool = meld

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

$ git difftool --dir-diff

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


0
投票
给了我(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

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