Git搜索所有差异

41

我想搜索与一个非常特定的变量名相关的git历史更改。

我尝试过这样做:

git diff HEAD~25000 | grep -in mydistinctvariablename

这些结果并没有告诉我这些输出行来自哪个提交,并且它需要相当长的时间(大约5-7分钟)。

是否有更好的解决方案,无论是在时间还是结果上?


2
可能是如何在Git历史记录中使用grep(搜索)?的重复问题。 - Andrew Marshall
哦,这些命令都没有告诉我搜索结果来自哪个版本,只有发生更改的文件。 - user712850
对我来说,在结果中文件名之前的SHA是最重要的。我使用了第一个答案中的第一个命令。然而,第二个答案可能更符合你的需求,并且如果你的日志格式显示它,它也会提供SHA。 - Andrew Marshall
1个回答

61

git log通常是查看提交历史记录时要使用的命令。git log --grep可用于在提交消息中搜索正则表达式。

您需要的是git log -S,它可以简单地搜索提交内容,或者git log -G,它可以使用正则表达式进行搜索:

-S<string> 查找引入或删除<string>实例的差异。请注意,这与字符串仅出现在diff输出中不同;有关更多详细信息,请参见gitdiffcore(7)中的pickaxe条目。

因此,例如,在msysGit存储库中,我可以使用以下任一方法找到引入Tcl 8.5.8的提交:

C:\src\msysgit\src>git log --oneline --grep "8\.5\.8"
d938476 Make `NO_SFX=1 portable-release.sh` work
ef1dc94 Update tk to version 8.5.8
a910049 Update tcl to version 8.5.8
a702d7f tcltk: update to 8.5.8 and exclude release.sh from the cleanup list

它只是在提交消息中查找8.5.8,或者您可以查看仅出现在提交差异中的字符串:

C:\src\msysgit\src>git log --oneline -S"version=8.5.8"
7be8622 tcltk: update release.sh script for tcl/tk 8.5.9
a702d7f tcltk: update to 8.5.8 and exclude release.sh from the cleanup list

你在示例中使用的范围限制仍然可以用于限制要检查的提交。仔细阅读git log手册,以充分了解它所能做的所有事情。

请注意,-S只查找简单的字符串差异 - 如果您真的想使用类似于示例的正则表达式搜索内容,则应该使用-G选项而不是-S,但这将显著降低速度。


1
如果可以的话,在第一个代码片段中,d938476 Make \NO_SFX=1 portable-release.sh` work` 这一行很令人困惑,因为它暗示了第一个代码片段是第二个代码片段的内容(换句话说,如果将该行从示例输出中删除,可能会更清晰明了...) - acdcjunior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接