我该如何向git log -S传递字符串而不仅仅是一个单词?

7

我想要查找包含字符串“hello world”或任何包含该短语的文件的提交。

git log -SHello World 不起作用

git log -S'Hello World' 不起作用

git log -S"hello world" 不起作用

我一直在使用:git log -i --grep='hello world' 但这仅适用于提交消息。


1
奇怪,在快速测试中,git log -S 'This repos' 对我来说是有效的。你使用的是哪个版本的Git? - Whymarrh
1
我的意思是,当我说“它不起作用”时,我的意思是当我知道我的日志注释中有那个短语时,我没有得到任何结果。 - VaTo
我阅读了git-log文档,但其中的意思并不是完全清晰的:*-S<string>:查找更改文件中指定字符串的出现次数(即添加/删除)的差异。旨在供脚本编写者使用。当您正在寻找精确的代码块(如结构体)并想要知道该块自首次出现以来的历史记录时,此功能非常有用:迭代使用该功能将感兴趣的块馈送回到-S中,并继续进行,直到获取该块的第一个版本。* - Nayuki
3个回答

8

镐头搜索(git log -S)查找提交中单词的添加删除(而不是在提交消息中)。
请参见此答案的评论

如果您有一个包含该单词的提交消息,但提交内容本身没有将“hello world”作为添加删除(例如,它已经存在于以前的提交中),则不会报告该提交。

除此之外,git log -S 'This repos'git log -S'This repos'应该可以正常工作。


0

关于命令git log "-Shello world"怎么样?


这与我在答案中提到的 git log -S "hello world"git log -S"hello world" 是一样的。 - VonC
@VonC 您是正确的,我之前以为其他选项的格式可能无效,但现在检查后,它似乎是有效的。 - Sagie

-1
我想要搜索包含字符串“hello world”的提交。
搜索提交非常简单:
git log | grep "new image"

或者包含该短语的任何文件提交。为此,您需要循环每个提交,检查它并搜索给定字符串。
对于这种类型的任务,您需要使用git filter-branch ...
# you will need something like:
git filter-branch --tree-filter "
      find . 
      -type f 
      -exec grep -rnw '/path/to/somewhere/' -e "pattern""

我觉得这应该有一个非常直接的命令,比如git log -S或类似的命令,而不是像编写脚本一样搜索短语。 - VaTo
这个看起来有很多问题。首先,reflog抱怨过滤命令中的换行符,然后find命令缺少\;,然后模式应该用单引号括起来,因为整个命令已经用双引号括起来了,这意味着模式实际上没有被引用。最后,reflog似乎实际上进行了一些重写,即使它没有改变任何东西...对我来说,问题在于git log -S'pattern'似乎找不到所有提交,甚至不是我知道匹配模式的提交。这真让人沮丧。 - mxmlnkn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接