【问题标题】:Git: Show all of the various changes to a single line in a specified file over the entire git historyGit:在整个 git 历史记录中显示对指定文件中单行的所有各种更改
【发布时间】:2012-03-30 00:10:48
【问题描述】:

我环顾四周,不确定这是否可能,但这里是:

我有一个 (javascript) 文件(例如 /lib/client.js),其中我有一个分配给变量的唯一标识符,如下所示: var identifier = "SOME_IDENTIFIER";

您可以将标识符视为版本号:我们会定期将此变量更改为新标识符。

我想做的是找到我们曾经使用过的所有唯一标识符。我怎样才能用 git 做到这一点?

我想可能有一种方法可以搜索 git 历史记录,并打印匹配 "var identifier =" 的行。我可以手动删除此列表。

无论如何,我很感激这里的任何见解。谢谢。

【问题讨论】:

标签: git


【解决方案1】:

从 git 1.8.4 开始,有更直接的方式来回答你的问题。

假设110 的行是var identifier = "SOME_IDENTIFIER"; 的行,那么这样做:

git log -L110,110:/lib/client.js

这将返回触及该代码行的每个提交。

[Git Documentation(见“-L”命令行参数)]

【讨论】:

    【解决方案2】:

    参见git-loggitdiffcore 的手册页。我相信这个命令会做到这一点,但它可能不太正确:

    git log -G "var identifier =" file.js
    

    编辑:这是一个粗略的开始,用于显示实际行的 bash 脚本。这可能是您正在寻找的更多内容。

    for c in $(git log -G "something" --format=%H -- file.js); do
        git --no-pager grep -e "something" $c -- file.js
    done
    

    它使用git log -G 查找有趣的提交,使用--format=%H 生成提交哈希列表。然后它遍历每个有趣的提交,要求git grep 显示该提交和文件中包含正则表达式的行,并以提交哈希开头。


    编辑:更改为使用 -G 而不是 cmets 中建议的 -S

    【讨论】:

    • @Rob - 感谢这一点 - 对您的脚本进行了小修改 - 仅放置文件名仅显示仅影响该文件的提交 - 如果提交引用了其他文件,则它未列出
    • @AdrianCornish - 很高兴它有帮助。我认为 OP 只想查看一个文件,但您说得对,删除文件名可能是一个更普遍有用的脚本。
    • 我的处境更加困难。有问题的文件从 paht_a/file 移动到 path_b/file。现在,当我在 path_b 中执行此操作时,它只显示文件从 path_a 移动到 path_b 时的更改。如果我在 path_a 中执行此操作,它会告诉我致命:模糊参数“文件”:未知修订或路径不在工作树中。
    • @AndySong - 如果您要搜索的字符串足够独特,也许您可​​以省略文件名并仍然得到您要查找的内容。
    • 对我来说更方便 - 在每次提交后放置一个空行,枚举行:sfile=path/to/some_file; sfind='string_to_find'; for c in $(git log -G $sfind --format=%H -- $sfile); do git --no-pager grep -e $sfind -n $c -- $sfile; echo; done
    【解决方案3】:

    你也可以用 gitk 做到这一点:

    gitk file.js
    

    在“提交”下拉菜单中,选择“添加/删除字符串:”并在旁边的文本框中输入“var identifier =”,任何添加或删除包含该字符串的行的提交都将突出显示.

    【讨论】:

    • 这有助于查明添加包含“var identifier ="的行的提交,但它没有显示修改此行的后续提交。
    • 你试过git blame file.jsgit gui blame file.js吗?
    • 我知道 git blame 的作用;我正在寻找完整的修订历史,而不是单个差异。
    • git gui blame file.js 会这样做...它会向您显示文件的所有修订版以及谁更改了它;您只需向后单击历史记录即可。
    • 我最终用 gitk 直观地浏览了一遍。我想有一些优雅的 git 技术可以做到这一点,但 gitk 已经足够好了。谢谢。
    【解决方案4】:

    如果您稍微调整一下@rob 的答案,git log 基本上会为您做到这一点,如果您只需要视觉比较:

    git log -U0 -S "var identifier =" path/to/file
    

    -U0 表示以补丁模式输出 (-p),并在补丁周围显示零行上下文。

    您甚至可以跨分支执行此操作:

    git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file
    

    可能有一种方法可以抑制差异标头,但我不知道有一种方法。

    【讨论】:

    • 为我工作!谢谢。
    【解决方案5】:

    magit,你可以这样做

    l, =L
    

    然后它会询问你文件和开始、结束行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多