如何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

https://blogs.atlassian.com/2013/05/git-tig/

要添加一个还没有提到的解决scheme,我不得不说,使用gitg的graphicssearch框是最简单的解决scheme。 它将select第一个出现,你可以用Ctrl-Gfind下一个。

在git中有一个命令,我认为find一个string要容易得多:

 git log --pretty=oneline --grep "string to search" 

在Git 2.0.4中工作