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

时间:2012-03-30 00:10:49

标签: git

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:81)

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

假设行110var identifier = "SOME_IDENTIFIER";行,那么请执行以下操作:

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

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

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

答案 1 :(得分:42)

请参阅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而不是-S

答案 2 :(得分:13)

您也可以使用gitk执行此操作:

gitk file.js

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

答案 3 :(得分:8)

如果你稍微调整@ 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标头,但我不知道一个。

答案 4 :(得分:2)

magit中,您可以使用

执行此操作
l, =L

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