如何根据文件扩展名过滤git diff?

vfc*_*sts 132 git file-extension

是否有限制git diff到一组给定文件扩展名的选项?

CB *_*ley 197

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

git diff -- '*.c' '*.h'
Run Code Online (Sandbox Code Playgroud)

  • 双划线很重要,例如.`git diff master HEAD - "*filename.txt"`也很有用`git diff master HEAD --name-only` (9认同)
  • 我使用大括号扩展,一个'git diff - *.{c,h,etc} (3认同)
  • 还必须在 git 存储库的根目录中执行此操作。 (3认同)
  • 可能是一个有趣的注释:在 Windows 上使用需要双引号。 (2认同)

seh*_*ehe 8

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

shopt -s globstar 
git diff -- *.py **/*.py
Run Code Online (Sandbox Code Playgroud)

或使用find:

find -name '*.py' -print0 | xargs -0 git diff --
Run Code Online (Sandbox Code Playgroud)

这两个都是特殊名称和空白证明.虽然您可能希望过滤扩展名为.py的目录:)


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

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


Boh*_*nik 6

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

git diff -- '***.py'
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这是最好的解决方案。您还可以排除一些文件/目录。例如:```git diff -- '***.py' ':!.Trashes'``` (2认同)

小智 6

在 git 版本 2.18.0 上测试,文件扩展名应该用双引号引起来。如果您想在拉取后找到本地存储库和远程存储库之间的最后差异,您可以使用:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"
Run Code Online (Sandbox Code Playgroud)

例如:

git diff master@{1} origin/master --name-only "*.cs"
Run Code Online (Sandbox Code Playgroud)