如何基于文件扩展名过滤git diff?


Answers:


227

是的,如果您确保git扩展了一个glob而不是您的shell,那么它将在任何级别都匹配,因此类似这样的内容(引号很重要)应该可以正常工作。

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

1
好的,我的git版本太旧了。按照1.7.8的规定工作。优秀的。

3
我的矿井进行了扩建,lagit diff -- *.{c,h,etc}
Matt Fletcher 2013年

9
双破折号很重要,例如。git diff master HEAD -- "*filename.txt"git diff master HEAD --name-only
–neaumusic,2015年

单引号('')也很重要!git diff -- src/*.js应该是git diff -- 'src/*.js'
Nickofthyme,

1
还必须在git仓库的根目录下执行此操作。
约翰·姜

10

要递归地包括文件(包括当前目录),这对我有用:

git diff -- '***.py'

1
对我来说,这是最好的解决方案。您也可以排除一些文件/目录。例如:git diff -- '***.py' ':!.Trashes'
Bartosz

三重星号(相对于单个星号)有什么作用?
Jann Poppinga

IIRC中的双星号(可能)表示嵌套目录(甚至为空),而单星号和.py表示文件名。因此,它应该是当前目录或任何嵌套目录中的* .py文件。
Bohumir Zamecnik

8

无论是使用shell的globstar(这确实递归搜索)1 ,2

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

或使用查找:

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

两者都是特殊名称和空格证明。尽管您可能想过滤扩展名为.py的目录:)


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

2启用globstar时,git diff -- **/*.py已经包括./*.py。在Bash的联机帮助页中:“如果后跟/,则两个相邻的* s仅匹配目录和子目录。”


4

对于简单的文件模式,这似乎可行:

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

空白安全,并且您也可以有多个扩展名:

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

3

扩展的命令行参数。

git diff *.py

或者,您可以通过管道find输入git diff

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

请使答案更具可读性。您可能已经足够了git diff *.py,没有标题就可以了
sehe 2011年

1
“ shout标题”是shell脚本中的#条注释。
hughdbrown 2011年

这是唯一对我有用的解决方案,引号(等)在Windows命令提示符下不起作用。
Ed Bayiates

1

如在git版本2.18.0上测试的,文件扩展名应该用双引号引起来。如果要查找本地存储库和远程存储库之间的最后区别,请在提取后使用:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

例如:

git diff master@{1} origin/master --name-only "*.cs"

1
当我提供-在扩展之前,就像这样,它对我git diff master@{1} origin/master --name-only -- "*.cs"
333年

0

在以下情况下,以上答案似乎都不适合我 git bash在Windows上,。我不确定这是版本(我正在使用1.8.4)还是Windows / bash版本。同样,在我的情况下,我想比较两个分支,其中每个分支都具有另一个分支中不存在的其他文件(因此,基于“查找”的文件被取消了)。

无论如何,这对我有用(在我的示例中,查找python文件之间的差异):

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

stackoverflow.com/a/8554987/4233229可以运行,但对于Windows,必须使用双引号而不是单引号
lcnittl 19-4-25

0

git diff 只会显示未暂存文件中的差异。

我发现了这个问题,因为我想从中排除.info文件git diff。我通过用进行分段来实现此目的git add *.info,这减少了剩余的文件。


0

我结束了这个:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

仅当文件名包含单词“ test”(不区分大小写)并且不以结束时.sql,此命令才会显示指定提交的差异,请根据情况修改管道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.