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-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
显示包含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
它会问你的文件和开始,结束行。