如何search存储库中的所有Git和Mercurial提交某个string?
我有一个Git仓库,只有很less的分支和悬而未决的提交。 我想search一个特定的string在存储库中的所有这样的提交。
我知道如何获得历史logging中的所有提交logging,但这些logging不包括分支或悬空的斑点,只是HEAD的历史logging。 我想让他们都find,find一个错误的具体提交。
我还想知道如何在Mercurial中这样做,因为我正在考虑切换。
你可以看到悬挂git log -g
。
-g, --walk-reflogs Instead of walking the commit ancestry chain, walk reflog entries from the most recent one to older ones.
所以你可以这样做,在一个悬而未决的提交消息中find一个特定的string:
git log -g --grep=search_for_this
或者,如果要search特定string的更改,可以使用镐符search选项“-S”:
git log -g -Ssearch_for_this # this also works but may be slower, it only shows text-added results git grep search_for_this $(git log -g --pretty=format:%h)
Git 1.7.4将添加-G选项 ,允许您传递-G <regexp>来查找包含<regexp>的行何时被移动,而-S不能这样做。 -S只会告诉你什么时候包含string的行总数发生了变化(即添加/删除string)。
最后,你可以使用gitk来显示悬挂的提交:
gitk --all $(git log -g --pretty=format:%h)
然后使用其searchfunction来查找错位的文件。 所有这些工作都假设丢失的提交没有“过期”并被垃圾收集,如果它hover了30天,并且过期了reflog或运行一个过期的命令,就可能发生这种情况。
在Mercurial中,您使用hg log --keyword
来search提交消息中的关键字,并使用hg log --user
来search特定用户。 请参阅hg help log
以了解限制hg help log
的其他方法。
除了使用git log -g --grep=<regexp>
或者git grep -e <regexp> $(git log -g --pretty=format:%h)
:请看下面的博客文章现任git维护者Junio C Hamano
- 有趣的“git log –grep”
- 有趣的“git grep”
概要
git grep和git log –grep都是面向行的 ,因为它们寻找匹配指定模式的行。
你可以使用git log --grep=<foo> --grep=<bar>
(或者git log --author=<foo> --grep=<bar>
,内部翻译成两个--grep
)来查找提交匹配任一模式(隐式或语义)。
因为是面向行的,所以有用的AND语义是使用git log --all-match --grep=<foo> --grep=<bar>
来查找同时具有第一行和第二行匹配的提交 。
使用git grep
你可以将多个模式(都必须使用-e <regexp>
forms)与 – --or
(这是默认的), --and
和--or
, (
和)
结合在一起。 对于grep --all-match
意味着文件必须有符合每个选项的行。
基于rq的答案,我发现这条线是做我想要的:
git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")
这将报告提交ID,文件名,并显示匹配的行,如下所示:
91ba969:testFile:this is a test
有没有人同意,这将是一个不错的select,包括在标准的git grep命令?
任何引用参数的命令都会接受git rev-list
手册页中logging的--all
选项,如下所示:
--all Pretend as if all the refs in $GIT_DIR/refs/ are listed on the command line as <commit>.
因此,例如git log -Sstring --all
将显示提交string
所有提交,并可以从分支或标签访问(我假设你的悬挂提交至less命名一个标签)。
用Mercurial你做一个
$ hg grep "search for this" [file...]
还有其他选项可以缩小search的修订范围。
不知道git,但是在Mercurial中,我只是将输出的hg日志输出到一些sed / perl /脚本来search你正在寻找的任何东西。 如果您愿意,您可以使用模板或样式自定义hg日志的输出,以便于search。
这将包括回购中的所有命名分支。 Mercurial没有像晃动blob afaik的东西。
如果您是vim用户,您可以安装tig(apt-get install tig),并使用/,相同的命令在vim上search
要添加一个还没有提到的解决scheme,我不得不说,使用gitg的graphicssearch框是最简单的解决scheme。 它将select第一个出现,你可以用Ctrl-Gfind下一个。
在git中有一个命令,我认为find一个string要容易得多:
git log --pretty=oneline --grep "string to search"
在Git 2.0.4中工作