是否有选项可以限制git diff
仅针对给定的文件扩展名进行比较?
是的,如果你确保git展开通配符而不是你的shell,则它将在任何级别匹配,因此像这样(引号很重要)应该完全可以工作。
git diff -- '*.c' '*.h'
这是我使用的方法,可以递归地包含文件(包括当前目录):
git diff -- '***.py'
git diff -- '***.py' ':!.Trashes'
- Bartosz你可以使用shell的globstar(它执行递归搜索)1,2:
shopt -s globstar
git diff -- *.py **/*.py
或使用find:
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 diff master@{1} origin/master --name-only -- "*.cs"
- 333对于简单的文件模式,这似乎是有效的:
$ 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 *.py
,无需响亮的标题。 - sehe注意参数顺序会产生影响...例如:
git diff master --name-only --relative -- "**/*.ts" "**/*.tsx" "**/*.js" "**/*.jsx" "**/*.vue"
**/*.ext
无法匹配 foo.ext
(不在文件夹中)。因此应该使用 ***.ext
等。 - Matthew D. Scholefield以上的答案似乎都不适用于我在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
将其暂存,从而减少了剩余的文件。
commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --
仅当文件名包含单词“test”(不区分大小写)且不以 .sql
结尾时,此处显示指定提交的差异,根据您的情况修改管道。
git diff -- *.{c,h,etc}
这样的用法。 - Matt Fletchergit diff master HEAD -- "*filename.txt"
。同时,git diff master HEAD --name-only
也是非常有用的。 - neaumusic