如何在 git diff 过程中忽略某些文件?

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

是否有可能在 git diff 期间忽略某些文件?我特别感兴趣的是过滤掉

Makefile.in
Makefile
、配置(以及所有自动生成的垃圾)。

git autotools git-diff
5个回答
5
投票

您可以尝试将文件列表传递给

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


2
投票

另一个类似的解决方案(添加到

.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
时,我遇到了超出大型项目中参数最大数量的问题。


0
投票

关于 gitignore 和 autotools 集成,您可能对 git.mk 感兴趣:http://mail.gnome.org/archives/desktop-devel-list/2009-April/msg00211.html


0
投票

详细说明here您可以使用

exclude
路径规范魔法

git diff -- . ':(exclude)Makefile*' ':(exclude)configure'

0
投票

如果您想忽略差异的内容,但仍然关心文件是否已更改,则这是

.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
可以做什么的更多详细信息,请参阅 文档;我的例子取自他们的,专门针对差异。

user3589608 的在此回答

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