【发布时间】:2012-01-23 04:42:45
【问题描述】:
是否可以将git diff 限制为给定的一组文件扩展名?
【问题讨论】:
标签: git file-extension
是否可以将git diff 限制为给定的一组文件扩展名?
【问题讨论】:
标签: git file-extension
注意参数顺序会有所不同...例如:
git diff master --name-only --relative -- "**/*.ts" "**/*.tsx" "**/*.js" "**/*.jsx" "**/*.vue"
'diff'后面需要跟'master'
【讨论】:
**/*.ext 不会捕获foo.ext(不在文件夹中)。所以应该是***.ext 等等。
在 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"
递归地包含文件(包括当前目录)这对我有用:
git diff -- '***.py'
【讨论】:
git diff -- '***.py' ':!.Trashes'
我结束了这个:
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 只会显示未暂存文件中的差异。
我发现这个问题是因为我想从git diff 中排除.info 文件。我通过使用git add *.info 暂存它来实现这一点,这减少了剩余的文件。
【讨论】:
在 Windows 上的 git bash 下,以上答案似乎都不适合我。我不确定它是版本的东西(我使用的是 1.8.4)还是 Windows/bash 的东西;另外,就我而言,我想区分两个分支,其中每个分支都有另一个分支中不存在的附加文件(因此基于“查找”的文件是疏忽的)。
无论如何这对我有用(在我的示例中,寻找 python 文件之间的差异):
git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
【讨论】:
要么使用你的 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 的手册页中:'如果后跟 /,两个相邻的 * 将仅匹配目录和子目录。'
【讨论】:
find 版本将不起作用。所以如果你有一个全局钩子,你将开始区分非 python 文件:(
扩展的命令行参数。
git diff *.py
或者,您可以将find 导入git diff:
find . -name '*.py' -type f | git diff --
【讨论】:
git diff *.py 就足够了,不用大喊大叫的标题
是的,如果你确保 git 扩展一个 glob 而不是你的 shell,那么它将在任何级别匹配,所以像这样的东西(引号很重要)应该可以正常工作。
git diff -- '*.c' '*.h'
【讨论】:
git diff -- *.{c,h,etc}
git diff master HEAD -- "*filename.txt" 也有用的是git diff master HEAD --name-only
对于简单的文件模式,这似乎可行:
$ git ls-files -zm '*.txt' | xargs --null git diff
空格安全,你也可以有多个扩展:
$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
【讨论】: