Git在单个文件的历史记录中搜索字符串


172

因此,如果我有一个名为foo.rb的文件,并且给我一个名为bar的缺少方法的错误,那么我想搜索的历史记录 foo.rb该字符串,bar以查看该字符串是否在过去定义过。

我找到了这个 搜索所有Git历史记录中的字符串?

但这会搜索所有文件。我只想在一个文件中搜索。


6
与FYI一样,-- filename如果要将其限制为一个文件,则可以追加一堆git命令。
Karl Bielefeldt 2012年

Answers:


234

为此,您可以使用-S选项来git log:

git log -S'bar' -- foo.rb

39
或者git log -G'bar' -- foo.rb搜索包含“ bar”的diff,而不是查找更改了“ bar”出现次数的提交(请参阅git-log联机帮助页)。
JakubNarębski2012年

1
用引号对我来说不起作用,我不得不用-Sbar它来搜索bar。也许与使用Windows命令行有关。
zbr

换句话说,它-G是用于正则表达式搜索的……这也是一个很好的参考:stackoverflow.com/a/4472267/2586761
ptim

17

或者,也许您可​​以尝试这一步(从相关问题中搜索所有git历史记录以获取string

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

它实际上将查找文件内容,而不提交任何出现bar的消息/补丁。


对于Windows :( for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb如果文件名或搜索词有空格,请注意双引号)
biscuit314

1
对我来说,在Windows中,如果没有“ do”,它是行不通的:( for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb 如果文件名或搜索短语有空格,请注意双引号)
xberger

2

git log命令有一个替代(来自manual):

$ git log Makefile      # commits that modify Makefile

因此,您可以使用:

git log foo.rb | grep "bar"

2
谢谢,但这只是搜索提交历史记录,而不是文件源的历史记录。
JD Isaacks 2012年

2
实际上,还有另一个替代可搜索字符串数据的更改:git log -S'foo()'#提交可添加或删除与字符串'foo()'相匹配的任何文件数据
Dmitry Reznik 2012年

1
您也可以尝试使用--full-diff参数。日志不仅显示提交历史记录,还显示差异。
德米特里·雷兹尼克

@DmitriyReznik-很明显,--full-diff如果没有-p,至少在git 1.7.9.5
sdaau

0

我使用 git log -S "string" --follow -p "path of file"来显示该字符串所有更改的完整历史记录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.