我正在尝试从 Git diff 中排除文件 (
db/irrelevant.php
)。我尝试将一个文件放入名为 db
的 .gitattributes
子目录中,并使用行 irrelevant.php -diff
我还尝试创建一个名为 .git/info/attributes
的文件,其中包含 db/irrelevant.php
。
在所有情况下,
db/irrelevant.php
文件都作为 Git 二进制补丁包含在 diff 中。我想要的是 diff 命令忽略对该文件的更改。我做错了什么?
天啊,驱动程序和
awk
排除一个糟糕的文件?从Git 1.9 开始你可以:
git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'
(在 Windows 上,将单引号
'
替换为双引号 "
。)
啊,优雅!请参阅引用的答案和详细信息这个答案,作者:@torek。
git diff ':!db/irrelevant.php'
它就在 diff 命令之后的
':!<path>'
处。 diff 命令可以像您喜欢的那样复杂,并且您可以根据需要使用通配符,例如 *.min.js
或添加多个排除(用空格分隔引用的块)。
您可以使用 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
命令(通过文档文件或其他方式)。 程序集合中的 filterdiff 程序来排除差异的某些部分。例如:
git diff | filterdiff -p 1 -x db/irrelevant.php
的回答非常好,能够看到文件已更改,但不能生成差异,在我的情况下,差异可能会很大。 但是我的一位同事建议了一种更简单并且对我有用的方法:
在
.gitattributes
要忽略的文件所在目录中添加
git diff
文件,内容如下:file-not-to-diff.bin -diff
仍然可以让 git status
“查看”文件是否发生更改。
git diff
也会“看到”文件已更改,但不会生成 diff
。示例中文件的 .bin
扩展名是故意的。我确实意识到这是 git 对于二进制文件的默认行为,并且不需要使用
.gitattributes
进行特殊处理。但就我而言,这些文件被 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/*"
}
git add *pattern_to_exclude*
git diff
git reset HEAD .
我知道这不是一个优雅的解决方案,有时无法使用(例如,如果您已经上演了一些东西),但它不需要输入复杂的命令就可以解决问题
git diff master `git diff --name-only master | grep -v pom.xml`
git add .
git reset <list of files to ignore>
git diff --cached
的解决方案,但还是分享一下:
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