是否有选项可以将
git diff
限制为一组给定的文件扩展名?
是的,如果你确保 git 扩展一个 glob 而不是你的 shell,那么它会在任何级别匹配,所以像这样的东西(引号很重要)应该可以正常工作。
git diff -- '*.c' '*.h'
要递归地包含文件(包括当前目录),这对我有用:
git diff -- '***.py'
使用 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 的联机帮助页中:“如果后跟 /,则两个相邻的 * 将仅匹配目录和子目录。”
在 git 2.18.0 版本上测试,文件扩展名应该用双引号引起来。如果您想在拉取后找到本地存储库和远程存储库之间的最后差异,您可以使用:
git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"
例如:
git diff master@{1} origin/master --name-only "*.cs"
对于简单的文件模式,这似乎有效:
$ git ls-files -zm '*.txt' | xargs --null git diff
空格安全,并且您也可以有多个扩展名:
$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
扩展的命令行参数。
git diff *.py
或者,您可以将
find
传输到 git diff
:
find . -name '*.py' -type f | git diff --
注意参数顺序有所不同...例如:
git diff master --name-only --relative -- "**/*.ts" "**/*.tsx" "**/*.js" "**/*.jsx" "**/*.vue"
“diff”后面需要跟“master”
在 Windows 上的
git bash
下,上述答案似乎都不适合我。我不确定这是版本问题(我使用的是 1.8.4)还是 Windows/bash 问题;另外,就我而言,我想比较两个分支,其中每个分支都有其他分支中不存在的其他文件(因此基于“查找”的文件是疏忽的)。
无论如何,这对我有用(在我的示例中,寻找 python 文件之间的差异):
git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
git diff
只会显示未暂存文件中的差异。
我发现这个问题是因为我想从
.info
中排除 git diff
文件。我通过使用 git add *.info
暂存它来实现这一点,这减少了剩余的文件。
我最终得到了这个:
commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --
仅当文件名包含单词“test”(不区分大小写)且不以
.sql
结尾时,才会显示指定提交的差异,请根据您的情况修改管道。
正如一些人在评论中指出的那样,在 Windows 上您需要使用
"
或根本不使用引号。单引号不起作用。