Git: 在整个 Git 历史中,在指定的文件中显示对一行的所有各种更改

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

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

您可以将这个标识符看作版本号: 我们将定期将这个变量更改为一个新的标识符。

我想做的是找到我们曾经使用过的所有唯一标识符。我怎么能用 Git 做这个呢?

我想可能有一种方法可以搜索 git 历史记录,并打印与 "var identifier ="匹配的行。我可以手动破解这份名单。

不管怎样,我希望你能提供点线索,谢谢。

55064 次浏览

请参见 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

您还可以使用 gitk 完成以下操作:

gitk file.js

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

如果你稍微调整一下@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 标头,但我不知道有这样一种方法。

自从 Git1.8.4以来,有一种更直接的方式来回答您的问题。

假设这条线 110是表示 var identifier = "SOME_IDENTIFIER";的线,然后这样做:

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

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

参见 ABC0关于 -L命令行参数的文档

Magit中,可以使用

l, =L

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