Git:将整个git历史记录中指定文件中的所有各种更改显示在一行中


112

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

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

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

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

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

无论如何,我将不胜感激。谢谢。


Answers:


106

从git 1.8.4开始,有一种更直接的方法来回答您的问题。

假设该行110var identifier = "SOME_IDENTIFIER";,则执行以下操作:

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

这将返回触及该行代码的所有提交。

[ Git文档(请参阅“ -L”命令行参数)]


49

有关git-log和的信息,请参见手册页gitdiffcore。我相信此命令可以做到,但可能并不完全正确:

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而不是-S在注释中建议。


@Rob-谢谢您-尽管对脚本进行了少量编辑-仅将文件名放入文件仅显示仅影响该文件的提交-如果提交引用了其他文件,则未列出该文件
Adrian Cornish 2012年

@AdrianCornish-很高兴这很有帮助。我认为OP仅希望查看一个文件,但是您完全正确地删除文件名可能是更通用的脚本。
2012年

我的处境更加艰​​难。有问题的文件从paht_a / file移到path_b / file。现在,当我在path_b中执行此操作时,它仅显示直到文件从path_a移至path​​_b为止的更改。如果我在path_a中执行此操作,则会告诉我致命:模糊参数'file':未知修订或路径不在工作树中。
安迪·宋

@AndySong-如果您要搜索的字符串足够唯一,则也许您可以不使用文件名,而仍然获得所需的内容。
2013年

对我来说更方便-在每次提交后都放置一个空白行,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

14

您也可以使用gitk做到这一点:

gitk file.js

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


这有助于查明添加了“ var identifier =“”行的提交,但未显示后续修改此行的提交。
findchris 2012年

2
您尝试过git blame file.js还是git gui blame file.js
伊桑·布朗

1
我知道git怪在做什么;我正在寻找修订的完整历史,而不是一个差异。
findchris 2012年

1
git gui blame file.js将执行此操作...它将向您显示文件的所有修订以及更改的人;您只需在历史记录中向后单击即可。
伊桑·布朗

我最终在视觉上逐步使用gitk。我想象有一些优雅的git技术可以做到这一点,但是gitk已经足够了。谢谢。
findchris

9

如果您只需要一点点适应@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

可能有一种抑制diff标头的方法,但我不知道。


为我工作!谢谢。
罗伯托·博尼尼

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.