如何grep Git为某个单词提交差异或内容?

Jes*_*sen 584 git search grep

在Git代码库中,我想列出包含特定单词的所有提交.我试过这个

git log -p | grep --context=4 "word"
Run Code Online (Sandbox Code Playgroud)

但它并不一定会给我回文件名(除非它比我搜索的单词少了5行.我也尝试过

git grep "word"
Run Code Online (Sandbox Code Playgroud)

但它只给我现在的文件,而不是历史.

如何搜索整个历史记录以便我可以跟踪特定单词的更改?我的意思是在我的代码库中搜索单词的出现以跟踪更改(在文件历史记录中搜索).

Jak*_*ski 849

如果要查找提交消息包含给定单词的所有提交,请使用

$ git log --grep=word
Run Code Online (Sandbox Code Playgroud)

如果你想找到所有在文件内容中添加或删除"word"的提交(更确切地说:"word"的出现次数发生变化),即搜索提交内容,使用所谓的'pickaxe'搜索

$ git log -Sword
Run Code Online (Sandbox Code Playgroud)

在现代的git中也有

$ git log -Gword
Run Code Online (Sandbox Code Playgroud)

查找添加或删除的行与"word"匹配的差异(也是提交内容).

请注意,-G默认情况下接受正则表达式,同时-S接受字符串,但可以修改为接受正则表达式使用--pickaxe-regex.

为了说明之间的区别-S<regex> --pickaxe-regex,并-G<regex>考虑在同一个文件中的以下DIFF提交:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
Run Code Online (Sandbox Code Playgroud)

虽然git log -G"regexec\(regexp"会显示此提交,但git log -S"regexec\(regexp" --pickaxe-regex不会(因为该字符串的出现次数没有改变).

  • `git log -S word`也适用于第二种情况 (5认同)
  • @MEM,` - grep`与`-S`和`-G`不同.您可以将字符串引用到每个参数中. (4认同)
  • @TankorSmash` -S <string>`查找引入或删除<string>实例的差异.`-G <string>`查找添加或删除的行与给定<regex>匹配的差异. (3认同)
  • @ m-ric,@ TankorSmash:不同之处在于`-S <string>`更快,因为它只检查`<string>`的出现次数是否发生了变化,而`-G <string>`搜索是否添加和删除了行在每个提交差异中. (3认同)
  • 如果你需要搜索中间有空格的单词,`git log --grep ="my words"`. (3认同)

u0b*_*6ae 251

git log的镐会发现包含"单词"的更改 git log -Sword

  • 这不完全准确.-S <string>查找引入或删除<string>实例的差异.**请注意,这与字符串只是出现在diff输出中不同;** (59认同)
  • 天哪!我不认为这是一个很好的理由拒绝正确答案......你不自信包括评论中的链接是否足够的鼓励? (15认同)
  • 虽然这通常是正确的答案,但我只是鼓励其他人阅读这个答案(http://stackoverflow.com/a/1340245/586983),它有3种不同的方式并解释了它们的微妙之处. (4认同)

Cha*_*esW 20

经过大量的实验,我可以推荐以下内容,它显示引入或删除包含给定正则表达式的行的提交,并显示每个中的文本更改,颜色显示添加和删除的单词.

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
Run Code Online (Sandbox Code Playgroud)

需要一段时间才能运行... ;-)

  • 这是迄今为止最好的感谢之一。提示:仅列出所有结果而不进行分页,可以在命令前添加`GIT_PAGER = cat`或在命令后附加`| 猫 (2认同)
  • 指定路径或文件会更快 `git log --pickaxe-regex -p --color-words -S "&lt;要搜索的正则表达式&gt;" &lt;文件或 fiepath&gt;` (2认同)
  • 您可以对输出添加限制,以防止其失控: `git log -n 1000 --pickaxe-regex -p --color-words -S "&lt;regexp to search for&gt;"` (2认同)

ken*_*orb 10

您可以尝试以下命令:

git log --patch --color=always | less +/searching_string
Run Code Online (Sandbox Code Playgroud)

grep以下列方式使用:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
Run Code Online (Sandbox Code Playgroud)

在要搜索的父目录中运行此命令.

  • 我喜欢这种方法,因为我正在查看的提交有数百行不相关的更改,我只对涉及我正在搜索的单词的实际补丁感兴趣.要获得颜色,请使用`git log --patch --color = always | 少+/searching_string`. (2认同)

1u-*_*1u- 8

另一种方法/语法是:git log -S "word"
像这样你可以搜索例子git log -S "with whitespaces and stuff @/#ü !"