Git:在整个git历史logging中显示指定文件中对单行的所有更改

我环顾四周,不知道这是否可能,但是这里有:

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

您可以将标识符想像为一个版本号:定期将这个variables更改为一个新的标识符。

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

我想可能有一种方式来searchgit的历史,并打印符合"var identifier =" 。 我可以手动取消这个列表。

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

由于git 1.8.4 ,有一个更直接的方式来回答你的问题。

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

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

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

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

请参阅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显示包含regex的提交和文件的行,以提交哈希开头。


编辑:更改为使用-G而不是-S如评论中所build议的。

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

 gitk file.js 

在“提交”下拉列表中,select“添加/删除string:”,在其旁边的文本框中input“var identifier =”,添加或删除包含该string的行的任何提交都将被突出显示。

如果你稍微修改@ 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 header,但是我不知道其中之一。

在magit中 ,你可以这样做

 l, =L 

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