【问题标题】:Git search for string in a single file's historyGit在单个文件的历史记录中搜索字符串
【发布时间】:2012-04-30 04:58:33
【问题描述】:

因此,如果我有一个名为 foo.rb 的文件,它给我一个名为 bar 的缺失方法的错误,所以我想搜索 foo.rb 的历史记录strong>foo.rb 查找字符串 bar 以查看它是否在过去被定义过。

我找到了这个Search all of Git history for a string?

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

【问题讨论】:

  • 仅供参考,如果您想将-- filename 限制在一个文件中,可以将其附加到一堆git 命令中。

标签: git


【解决方案1】:

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

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

【讨论】:

  • git log -G'bar' -- foo.rb 搜索包含“bar”的差异,而不是搜索更改了“bar”出现次数的提交(参见 git-log 手册页)。
  • 引号对我不起作用,我不得不使用-Sbar 来搜索bar。也许这与我使用 Windows 命令行有关。
  • 换句话说,-G 用于正则表达式搜索...这也是一个很好的参考:stackoverflow.com/a/4472267/2586761
【解决方案2】:

或者也许你可以试试这个(来自相关问题Search all of git history for 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(如果文件名或搜索短语有空格,请注意双引号)
  • 对我来说,在 Windows 中,如果没有“do”,它就无法工作:for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb(如果文件名或搜索短语有空格,请注意双引号)
【解决方案3】:

git log 命令有一个覆盖(来自manual):

$ git log Makefile      # commits that modify Makefile

所以你可以使用:

git log foo.rb | grep "bar"

【讨论】:

  • 谢谢,但这只是搜索提交历史,而不是文件源的历史。
  • 实际上还有另一个覆盖搜索字符串数据更改: git log -S'foo()' # 添加或删除与字符串 'foo()' 匹配的任何文件数据的提交
  • 您也可以尝试使用 --full-diff 参数。日志不仅显示提交历史,还显示差异。
  • @DmitriyReznik - 显然--full-diff 没有-p 不起作用(如,没有显示差异),至少在 git 1.7.9.5 上
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多