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

问题描述 投票:0回答:11

是否有选项可以将

git diff
限制为一组给定的文件扩展名?

git file-extension
11个回答
335
投票

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

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

38
投票

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

git diff -- '***.py'

10
投票

使用 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 的联机帮助页中:“如果后跟 /,则两个相邻的 * 将仅匹配目录和子目录。”


6
投票

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

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

例如:

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

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 --

2
投票

注意参数顺序有所不同...例如:

git diff master --name-only --relative -- "**/*.ts" "**/*.tsx" "**/*.js" "**/*.jsx" "**/*.vue"

“diff”后面需要跟“master”


1
投票

在 Windows 上的

git bash
下,上述答案似乎都不适合我。我不确定这是版本问题(我使用的是 1.8.4)还是 Windows/bash 问题;另外,就我而言,我想比较两个分支,其中每个分支都有其他分支中不存在的其他文件(因此基于“查找”的文件是疏忽的)。

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

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

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
结尾时,才会显示指定提交的差异,请根据您的情况修改管道。


0
投票

正如一些人在评论中指出的那样,在 Windows 上您需要使用

"
或根本不使用引号。单引号不起作用。

  • git diff --“.c”“.h”
  • git diff -- *.c *.h
© www.soinside.com 2019 - 2024. All rights reserved.