我希望git diff
的结果按文件名过滤。
特别是,我希望所有名为“AssemblyInfo.cs”的文件都有一个diff,但是它位于git存储库中的任何位置。
我在Cygwin上使用git,如果这有所不同。
答案 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 rm
和git 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起可用