是否有可能在 git diff 期间忽略某些文件?我特别感兴趣的是过滤掉
Makefile.in
、Makefile
、配置(以及所有自动生成的垃圾)。
您可以尝试将文件列表传递给
git diff
,它将仅对这些文件执行差异。
根据您的代码设置方式,它可以很简单:
git diff otherbranchname -- src/ # only give me diffs from src/
或者难看/复杂:
git diff otherbranchname -- $( git ls-files |
perl -lne'next if /(?:[mM]akefile(?:\.in)?|configure|whateverelse)/;print' )
# diff all files which don't match the pattern
根据您要忽略的文件是否由当前分支中的 Git 管理,您需要将
git ls-files
替换为 find *
;使用 find .
并将 |.git
添加到 Perl 表达式中。
根据您认为合适的情况进行定制,可能使用您想要比较的目录/文件名知道,而不是使用
git ls-files
或find
。
另一个类似的解决方案(添加到
.git/config
):
[alias]
mydiff = !git diff -- $(git diff --name-only | grep -Ev "([mM]akefile|configure)")
然后运行它:
git mydiff
请注意,
git diff --name-only
比git ls-files
更好,因为它会将较短的文件列表传递给git diff
,因为只会包含已修改的文件。在使用 git ls-files
时,我遇到了超出大型项目中参数最大数量的问题。
关于 gitignore 和 autotools 集成,您可能对 git.mk 感兴趣:http://mail.gnome.org/archives/desktop-devel-list/2009-April/msg00211.html
如果您想忽略差异的内容,但仍然关心文件是否已更改,则这是
.gitattributes
和 diff
属性的工作。假设你有一个像这样的目录结构
repo
repo/foo
repo/foo/Makefile
repo/bar
repo/bar/Makefile.in
repo/bar/baz
repo/bar/baz/Makefile.in
如果您想忽略所有三个 Makefile,请将
repo/.gitattributes
创建为:
Makefile* -diff
如果您想忽略
bar/Makefile.in
但不想忽略其他,请将 repo/bar/.gitattributes
创建为
Makefile.in -diff
而且还
repo/bar/baz/.gitattributes
作为
Makefile.in diff
有关
.gitattributes
可以做什么的更多详细信息,请参阅 文档;我的例子取自他们的,专门针对差异。