我有一个很少有分支和悬空提交的Git存储库。我想在存储库中搜索一个特定字符串的所有这样的提交。

我知道如何获得历史中所有提交的日志,但这些不包括分支或悬垂的blobs,只包括HEAD的历史。我想把它们都找回来,找到一个被放错地方的特定提交。

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


当前回答

基于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命令?

其他回答

任何以引用作为参数的命令都将接受——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将显示所有提到字符串的提交,并且可以从分支或标签访问(我假设你的悬垂提交至少有一个标签命名)。

基于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命令?

git中的一个命令,我认为它更容易找到一个字符串:

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

适用于Git 2.0.4

我不知道git,但在Mercurial中,我只是将hg log的输出管道到一些sed/perl/任何脚本来搜索你正在寻找的东西。如果您愿意,可以使用模板或样式自定义hg日志的输出,使其更易于搜索。

这将包括回购中所有已命名的分支。Mercurial没有像悬挂blobs之类的东西。

为了补充一个尚未提到的解决方案,我不得不说,使用gitg的图形搜索框对我来说是最简单的解决方案。它将选择第一个事件,您可以使用Ctrl-G找到下一个事件。