在Git代码库中,我想列出包含某个单词的所有提交。我试过了
git log -p | grep --context=4 "word"
但它不一定会返回文件名(除非它与我搜索的单词相距不到五行。我也尝试过
git grep "word"
但它只给了我目前的档案,而不是历史。
如何搜索整个历史,以便跟踪特定单词的变化?我打算在我的代码库中搜索单词的出现,以跟踪更改(在文件历史中搜索)。
在Git代码库中,我想列出包含某个单词的所有提交。我试过了
git log -p | grep --context=4 "word"
但它不一定会返回文件名(除非它与我搜索的单词相距不到五行。我也尝试过
git grep "word"
但它只给了我目前的档案,而不是历史。
如何搜索整个历史,以便跟踪特定单词的变化?我打算在我的代码库中搜索单词的出现,以跟踪更改(在文件历史中搜索)。
当前回答
您可以尝试以下命令:
git log --patch --color=always | less +/searching_string
或按以下方式使用grep:
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
在要搜索的父目录中运行此命令。
其他回答
gitlog的鹤嘴锄将通过gitlog-Sword查找包含“word”在内的更改的提交
如果要查找提交消息包含给定单词的所有提交,请使用
$ git log --grep=word
如果要查找文件内容中添加或删除“word”的所有提交(更准确地说:“word”出现的次数发生了变化),即搜索提交内容,请使用
$ git log -Sword
在现代Git中
$ git log -Gword
查找添加或删除的行与“word”匹配的差异(也包括提交内容)。
需要注意的几点:
-默认情况下,G接受正则表达式,而-S接受字符串,但可以使用--pickaxe正则表达式将其修改为接受正则表达式。-S查找“单词”出现次数发生变化的提交,而-G查找差异中出现“单词”的提交。这意味着-S<regex>--pickcaxe regex和-G<regex>做的事情并不完全相同。
gitdiff文档对差异有很好的解释:
为了说明-S<regex>--pickaxe regex和-G<regex>之间的区别,请考虑在同一文件中使用以下diff进行提交:+返回frotz(nitfol,two->ptr,1,0);...-hit=frotz(nitfol,mf2.ptr,1,0);虽然git-log-G“frotz\(nitfol)”将显示此提交,但git-log-S“frots\(nitfol)”--pickaxe regex不会显示(因为该字符串的出现次数没有改变)。
如果你想搜索敏感数据,以便将其从Git历史记录中删除(这就是我登陆这里的原因),有一些工具可以实现这一点。GitHub作为该问题的专用帮助页面。
以下是本文的要点:
BFG Repo Cleaner是git过滤器分支的一种更快、更简单的替代方法,用于删除不需要的数据。例如,要删除包含敏感数据的文件并保持最新提交不受影响),请运行:
bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
要替换passwords.txt中列出的所有文本,请运行:
bfg --replace-text passwords.txt
请参阅BFG Repo Cleaner的文档以了解完整的用法和下载说明。
经过大量实验,我可以推荐以下内容,其中显示了引入或删除包含给定正则表达式的行的提交,并显示每个行中的文本更改,颜色显示添加和删除的单词。
git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
需要一段时间才能运行…;-)
还有一种方法/语法是:git-log-S“word”像这样,你可以搜索gitlog-S“带有空格和其他@/#ü!”