如何grep Git提交某个单词的差异或内容?
在Git代码库中,我想列出包含某个单词的所有提交。 我试过这个
git log -p | grep --context=4 "word"
但是这并不一定会让我知道文件名(除非我所search的文字远不及5行),我也试过了
git grep "word"
但它只给出我现在的文件,而不是历史。
如何search整个历史logging,以便我可以跟踪特定单词的变化? 我的意思是search我的代码库的单词出现追踪更改(在文件历史search)。
如果你想查找提交信息包含给定单词的所有提交,请使用
$ git log --grep=word
如果你想查找文件内容中添加或删除“word”的所有提交(更确切的说:“word”出现的次数改变了),即search提交内容 ,使用所谓的“pickaxe”search
$ git log -Sword
在现代的混帐也有
$ git log -Gword
寻找添加或删除的行匹配“单词”(也提交内容 )的差异 。
请注意, -G
默认接受正则expression式,而-S
接受一个string,但可以修改为使用--pickaxe-regex
接受--pickaxe-regex
。
为了说明
-S<regex> --pickaxe-regex
和-G<regex>
之间的区别,请考虑在同一个文件中使用以下差异的提交:+ return !regexec(regexp, two->ptr, 1, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
而
git log -G"regexec\(regexp"
会显示这个提交,git log -S"regexec\(regexp" --pickaxe-regex
不会(因为该string的出现次数没有改变)。
git log
的镐会用git log -Sword
find包含“word”的git log -Sword
经过大量的实验后,我可以推荐下面的代码,它显示了提交或者删除包含给定正则expression式的行,并且在每个行中显示文本变化,颜色显示增加和删除的单词。
git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
需要一段时间才能运行… 😉
另外一种方法/语法是: git log -S "word"
像这样,你可以search例如git log -S "with whitespaces and stuff @/#ü !"
你可以尝试下面的命令:
git log --patch --color=always | less +/searching_string
或者用下面的方法使用grep
:
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
在要search的父目录中运行此命令。
vim-vgitive是在Vim中用于这种检查的多function程序。
使用:Ggrep
来做到这一点。 欲了解更多信息,您可以安装vim-fugitive,并通过:help Grep
查找。 而这个插曲: 探索Git-repository-history-of-git-repository会引导你去做所有的事情。
在正则expression式上使用布尔连接器:
git log --grep '[0-9]*\|[az]*'
这个正则expression式在提交消息上search正则expression式[0-9] *或[az] *。