应该使用什么选项将git diff限制为给定的一组文件扩展名?

有没有一个选项来限制git diff给定的一组文件扩展名?

是的,如果你确保git扩展一个glob而不是你的shell,那么它会在任何级别匹配,所以像这样(引号是重要的)应该工作正常。

 git diff -- '*.c' '*.h' 

要么使用你的shell的globstar(这是一个recursionsearch) 1,2

 shopt -s globstar git diff -- *.py **/*.py 

或者使用find:

 find -name '*.py' -print0 | xargs -0 git diff -- 

这两个都是特殊名称和空白certificate。 尽pipe您可能想要过滤具有.py扩展名的目录:)


1我喜欢通常做git diff -- {.,**}/*.py

2启用globstar时, git diff -- **/*.py ./*.py已包含./*.py 。 在Bash的manpage中:'如果后面跟着一个/,两个相邻的*只会匹配目录和子目录。

对于简单的文件模式,这似乎工作:

 $ git ls-files -zm '*.txt' | xargs --null git diff 

空格是安全的,你也可以有多个扩展:

 $ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff 

用于扩展的命令行参数。

 git diff *.py 

另外,你可以通过pipe道findgit diff

 find . -name '*.py' -type f | git diff -- 

上面的答案似乎没有在Windows下的git bash下工作。 我不知道它是一个版本的东西(我使用1.8.4)或Windows / bash的东西; 另外,就我而言,我想要区分两个分支,其中每个分支都有其他分支中不存在的附加文件(因此,基于“find”的分支是不存在的)。

无论如何这工作对我来说(在我的例子中,寻找python文件之间的差异):

 git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5` 

git diff只会显示未分离文件的差异。

我发现这个问题,因为我想从git diff排除.info文件。 我通过使用git add *.info来实现这一点,从而减less了剩下的文件。