git diff按文件名过滤

时间:2013-03-15 17:46:00

标签: git bash git-diff git-bash

我希望git diff的结果按文件名过滤。

特别是,我希望所有名为“AssemblyInfo.cs”的文件都有一个diff,但是它位于git存储库中的任何位置。

我在Cygwin上使用git,如果这有所不同。

6 个答案:

答案 0 :(得分:15)

git diff的文件参数需要--分隔 - 试试这个:

find . -name <pattern> | xargs git diff --

xargs确保正确处理空格,制表符,换行符等。

您可以使用--name-status参数git diff调试它。你也可以尝试:

git diff --name-only | grep <pattern>

[edit]试试:

git diff --name-status -- `find . -name '<pattern>'`
ebg@taiyo(98)$ git diff --name-status -- `find . -name '*.scm'`
M       scheme/base/boolean.scm
M       surf/compiler/common.scm
M       surf/compiler/compile.scm
M       surf/compiler/expand.scm

答案 1 :(得分:4)

最简单的方法是简单地使用通配符:

git diff -- *AssemblyInfo.cs


至少这适用于我的Git v1.8.4。

答案 2 :(得分:0)

您可以使用pipeline

find . -name AssemblyInfo.cs | git diff

使用find过滤名为“AssemblyInfo.cs”的所有文件,然后将输出用作git diff的参数。

答案 3 :(得分:0)

虽然the answer given by GoZoner适用于某些(百?)文件,但它会多次执行git diff(在xargs的情况下)或失败(在git diff … -- `find …`的情况下) )如果有大量文件要差异。这可能是一个问题,取决于您的使用案例。

一种可能的解决方案是创建一个提交,其中只包含对感兴趣文件的更改并区分提交。根据{{​​3}},我提出了这个解决方案:

git co <new_branch> --detach
git reset --soft <old_branch>

现在git status --porcelain | grep <pattern>显示了应该比较的所有文件。通过将-v传递给grep,即git status --porcelain | grep -v <pattern>,可以列出所有其他文件。需要将此文件重置为<old_branch>

状态
# Remove the destination of renamed and copied files not matching <pattern>
git status --porcelain | grep -v <pattern> | grep '^R \|^C ' | sed 's/.* -> //' | xargs git rm -f --
# Remove added files not matching <pattern>
git status --porcelain | grep -v <pattern> | grep '^A ' | cut -c 4- | xargs git rm -f --
# Restore deleted files not matching <pattern>
git status --porcelain | grep -v <pattern> | grep '^M \|^D ' | cut -c 4- | xargs git checkout HEAD --

(请注意,在这种情况下使用xargs不是问题,因为多次调用git rmgit checkout都可以。)

现在,索引(和工作副本)仅包含对<pattern>匹配的文件的更改。接下来要做的就是提交这些更改:

git commit -m "Changes between <old_branch> and <new_branch> in files matching <pattern>"

就是这样!现在我们可以像往常一样使用git diff

git diff HEAD^..HEAD

您可以使用您喜欢的所有选项或参数。

注意:此解决方案未经过广泛测试,可能会失败,例如:对于带有特殊字符或其他特殊情况的文件...欢迎提出改进解决方案的建议; - )

答案 4 :(得分:0)

find . -iregex AssemblyInfo\.cs -exec git diff {} +

您可以用正则表达式替换AssemblyInfo\.cs

答案 5 :(得分:0)

可能最简单的选择是使用:

git diff "*/*AssemlyInfo.cs"

自git 2.20.1起可用