如何在存储库中搜索特定字符串的所有Git和Mercurial提交?

时间:2009-04-14 07:49:49

标签: git mercurial

我有一个Git存储库,只有很少的分支和悬空提交。我想在存储库中搜索所有此类提交以获取特定字符串。

我知道如何获取历史记录中所有提交的日志,但这些不包括分支或悬空blob,只是HEAD的历史记录。我希望得到所有这些,找到一个错位的特定提交。

我也想知道如何在Mercurial中做到这一点,因为我正在考虑转换。

10 个答案:

答案 0 :(得分:326)

您可以看到与git log -g悬挂的提交。

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

所以你可以这样做来在悬挂的提交消息中找到一个特定的字符串:

git log -g --grep=search_for_this

或者,如果要搜索特定字符串的更改,可以使用pickaxe搜索选项“-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将add the -G option,允许你传递-G< regexp>查找包含< regexp>的行的时间被动了,哪个不能做。 -S只会告诉你包含字符串的行总数何时发生变化(即添加/删除字符串)。

最后,您可以使用gitk来显示悬挂提交:

gitk --all $(git log -g --pretty=format:%h)

然后使用其搜索功能查找放错位置的文件。所有这些工作假设丢失的提交没有“过期”并且被垃圾收集,如果它悬空30天并且你使reflogs过期或运行一个使它们到期的命令,则可能发生这种情况。

答案 1 :(得分:54)

在Mercurial中,您使用hg log --keyword在提交消息中搜索关键字,并使用hg log --user搜索特定用户。有关限制日志的其他方法,请参阅hg help log

答案 2 :(得分:22)

除了richq answer使用git log -g --grep=<regexp>git grep -e <regexp> $(git log -g --pretty=format:%h)之外,请查看Junio C Hamano的以下博客文章,当前的git维护者


摘要

git grepgit log --grep都是面向行的,因为它们会查找与指定模式匹配的行。

您可以使用git log --grep=<foo> --grep=<bar>(或内部转换为两个git log --author=<foo> --grep=<bar>的{​​{1}})来查找与 模式匹配的提交(隐式 OR 语义)。

由于是面向行的,有用的 AND 语义是使用--grep来查找 提交 >两者第一行匹配,第二行匹配第二行。

使用git log --all-match --grep=<foo> --grep=<bar>,您可以将多个模式(所有必须使用git grep表单)与-e <regexp>(默认值),--or,{{1}相结合},--and--not。对于grep (,意味着 文件 必须包含与每个备选项匹配的行。

答案 3 :(得分:11)

在rq的答案基础上,我发现这条线符合我的要求:

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

将报告提交ID,文件名,并显示匹配的行,如下所示:

91ba969:testFile:this is a test

...是否有人同意这是一个很好的选择,可以包含在标准的git grep命令中?

答案 4 :(得分:5)

任何将引用作为参数的命令都将接受--all手册页中记录的git rev-list选项,如下所示:

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

因此,例如git log -Sstring --all将显示所有提及string且可从分支或标记访问的提交(我假设您的悬挂提交至少以标记命名)

答案 5 :(得分:5)

使用Mercurial进行

$ hg grep "search for this" [file...]

还有其他选项可以缩小搜索范围。

答案 6 :(得分:2)

不知道git,但是在Mercurial中我只是将hg日志的输出传递给某些sed / perl /无论什么脚本来搜索你正在寻找的任何东西。如果您愿意,可以使用模板或样式自定义hg日志的输出,以便于搜索。

这将包括repo中的所有命名分支。 Mercurial没有类似悬挂blob的东西。

答案 7 :(得分:1)

如果您是vim用户,可以安装tig(apt-get install tig),并使用/,相同的命令在vim上搜索

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

答案 8 :(得分:1)

要添加一个尚未提及的解决方案,我不得不说使用gitg的图形搜索框对我来说是最简单的解决方案。它将选择第一个匹配项,您可以使用Ctrl-G找到下一个匹配项。

答案 9 :(得分:1)

git中的一个命令,我认为找到一个字符串要容易得多:

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

适用于Git 2.0.4