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

时间:2009-08-26 20:34:56

标签: git search grep

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

git log -p | grep --context=4 "word"

但它不一定会给我回文件名(除非它少于5 远离我搜索的单词的行。我也试过

git grep "word"

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

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

8 个答案:

答案 0 :(得分:806)

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

$ git log --grep=word

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

$ git log -Sword

在现代git中也有

$ git log -Gword

查找差异,其添加或删除的行与“word”匹配(同时提交内容)。

请注意,-G默认接受正则表达式,而-S接受字符串,但可以使用--pickaxe-regex修改为接受正则表达式。

  

为了说明-S<regex> --pickaxe-regex-G<regex>之间的区别,请考虑在同一文件中使用以下差异进行提交:

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

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

答案 1 :(得分:249)

git log的镐会发现包含“git log -Sword

字样的提交内容

答案 2 :(得分:18)

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

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

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

答案 3 :(得分:9)

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

答案 4 :(得分:7)

您可以尝试以下命令:

git log --patch --color=always | less +/searching_string

或以下列方式使用grep

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

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

答案 5 :(得分:2)

在正则表达式上使用布尔连接器:

git log --grep '[0-9]*\|[a-z]*'

此正则表达式在提交消息上搜索正则表达式[0-9] *或[a-z] *。

答案 6 :(得分:2)

vim-fugitive对于Vim中的这种检查是多才多艺的。

使用apiclient.js来做到这一点。有关更多信息,您可以安装vim-fugitive并按../app/stores/util/apiclient.js查找turorial。这一集:exploring-the-history-of-a-git-repository将引导你完成所有这些。

答案 7 :(得分:0)

如果你想搜索敏感数据以便从你的git历史中删除它(这就是我登陆这里的原因),那么有一些工具可以解决这个问题。 Github为a dedicated help page for that issue

这是文章的要点:

  

BFG Repo-Cleaner是git filter-branch的一种更快,更简单的替代方法,用于删除不需要的数据。例如,要删除包含敏感数据的文件并保持最新的提交不变,请运行:

z-script
  

要替换在password.txt中列出的所有文本,只要在您的资源库历史记录中找到它,请运行:

setup-XY
  

有关完整用法和下载说明,请参阅BFG Repo-Cleaner's documentation