为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Git历史记录中实现GREP(搜索)提交的代码?

如何在Git历史记录中实现GREP(搜索)提交的代码?

Git
斯蒂芬大帝 2019-07-02 14:39:40
在过去的某个时候,我在文件中删除了一个文件或一些代码。我可以在内容中(而不是在提交消息中)实现grep吗?一个非常糟糕的解决方案是grep日志:git log -p | grep <pattern>但是,这不会立即返回提交哈希。我到处玩git grep没有结果。如何在Git历史记录中实现GREP(搜索)提交的代码?
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

搜索提交含量(例如,实际的源代码行,而不是提交消息等等),您需要这样做:

git grep <regexp> $(git rev-list --all)

git rev-list --all | xargs git grep <expression>如果您遇到“参数列表太长”错误,将工作。

如果要将搜索限制在某个子树(例如,“lib/util”),则需要将其传递给rev-list子命令和grep此外:

git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

这将使grep贯穿于您提交的所有文本中。regexp.

在这两个命令中传递路径的原因是rev-list的所有更改将返回修订列表。lib/util发生了,但你也需要通过grep所以它只会搜索lib/util.

想象一下以下场景:grep可能会找到同样的<regexp>返回的相同版本中包含的其他文件。rev-list(即使对该修订本的档案没有任何改动)。

以下是搜索源的其他一些有用方法:

搜索文本匹配正则表达式regexp的工作树:

git grep <regexp>

搜索工作树,查找匹配正则表达式regexp1或regexp2的文本行:

git grep -e <regexp1> [--or] -e <regexp2>

搜索工作树,查找匹配正则表达式regexp1和regpe 2的文本行,仅报告文件路径:

git grep -e <regexp1> --and -e <regexp2>

搜索工作树,查找具有文本匹配正则表达式regge 1和文本匹配正则表达式regbe 2行的文件:

git grep -l --all-match -e <regexp1> -e <regexp2>

搜索工作树,查找更改的文本匹配模式行:

git diff --unified=0 | grep <pattern>

搜索所有修订,以找到匹配正则表达式regexp的文本:

git grep <regexp> $(git rev-list --all)

搜索Rev1和Rev2之间的所有修订,寻找匹配正则表达式regexp的文本:

git grep <regexp> $(git rev-list <rev1>..<rev2>)


查看完整回答
反对 回复 2019-07-02
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

您应该使用镐(-S)任选git log

寻找Foo:

git log -SFoo -- path_containing_change 
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change

看见Git历史记录-按关键字查找丢失的行为了更多。


Jakub Narębski评论:

  • 这,这个查找引入或删除<string>.
    它的意思通常是“用‘foo’添加或删除行的修订”。

  • 这个--pickaxe-regex选项允许您使用扩展的POSIX正则表达式,而不是搜索字符串。


罗布注释,这个搜索是区分大小写的-他打开了一个跟进问题如何搜索-不区分大小写。


查看完整回答
反对 回复 2019-07-02
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我最喜欢的方法是git log-G选项(添加在1.7.4版中)。

-G<regex>
       Look for differences whose added or removed line matches the given <regex>.

-G-S选项确定提交是否匹配:

  • 这个

    -S

    选项实质上计算在提交之前和之后搜索在文件中匹配的次数。如果前后计数不同,则提交将显示在日志中。例如,这将不会显示与搜索相匹配的行被移动的位置。
  • 带着

    -G

    选项时,如果搜索与添加、删除或更改的任何行匹配,则提交将显示在日志中。

以这个提交为例:

diff --git a/test b/test
index dddc242..60a8ba6 100644
--- a/test
+++ b/test
@@ -1 +1 @@
-hello hello
+hello goodbye hello

由于文件中出现“hello”的次数与此提交之前和之后相同,因此它将不匹配-Shello..但是,由于对行匹配进行了更改hello,则将使用-Ghello.


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 932 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信