【问题标题】:Git search all diffsGit搜索所有差异
【发布时间】:2012-06-17 00:53:59
【问题描述】:

我正在尝试在我的 git 历史记录中搜索与一个非常具体的变量名相关的更改。

我试过这样做:

git diff HEAD~25000 | grep -in mydistinctvariablename

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

有没有人有更好的解决方案、时间和结果?

【问题讨论】:

  • 嗯,这些命令都没有告诉我搜索结果来自哪个版本,只有发生更改的文件
  • 对我有用,它是结果中文件名之前的 SHA。我在第一个答案中使用了第一个命令。 second answer 可能还有更多您正在寻找的内容,这也提供了 SHA(前提是您的日志格式显示了它)。

标签: git search grep diff


【解决方案1】:

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

您所追求的是git log -S,它简单地搜索提交内容或git log -G,它使用正则表达式搜索它:

-S 寻找引入或删除 .请注意,这与仅出现在 diff 输出中的字符串不同;有关详细信息,请参阅 gitdiffcore(7) 中的镐条目。

因此,例如,在 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 但这将是显着的慢一点。

【讨论】:

  • 如果可以的话,在第一个 sn-p 中,d938476 Make `NO_SFX=1 portable-release.sh` work 行令人困惑,因为暗示第一个 sn-p 是第二个(换句话说,我认为它会如果从示例输出中删除该行会更清楚...)
猜你喜欢
  • 2022-08-16
  • 1970-01-01
  • 2016-05-31
  • 2013-12-11
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
相关资源
最近更新 更多