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

fin*_*ris 101 git

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

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

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

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

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

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

Ale*_*ird 93

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

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

git log -L110,110:/lib/client.js
Run Code Online (Sandbox Code Playgroud)

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

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


rob*_*rob 45

请参阅手册页git-loggitdiffcore.我相信这个命令可以做到,但它可能不太正确:

git log -G "var identifier =" file.js
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个粗略的开始,用于显示实际行的bash脚本.这可能是您正在寻找的更多内容.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done
Run Code Online (Sandbox Code Playgroud)

它用于git log -G查找有趣的提交,--format=%H用于生成提交哈希列表.然后迭代每个有趣的提交,要求git grep显示该提交的行和包含正则表达式的文件,前面带有提交哈希.


编辑:更改为使用-G而不是-S在评论中建议.


Eth*_*own 14

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

gitk file.js
Run Code Online (Sandbox Code Playgroud)

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

  • 你试过`git blame file.js`或`git gui blame file.js`吗? (2认同)

And*_*rew 8

如果您稍微调整@ rob的答案,git log基本上会为您做这个,如果你需要的只是一个视觉比较:

git log -U0 -S "var identifier =" path/to/file
Run Code Online (Sandbox Code Playgroud)

-U0表示以补丁模式(-p)输出,并在补丁周围显示零行上下文.

您甚至可以跨分支执行此操作:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file
Run Code Online (Sandbox Code Playgroud)

可能有一种方法来抑制diff头,但我不知道一个.


小智 5

magit中,你可以这样做

l, =L
Run Code Online (Sandbox Code Playgroud)

然后它会询问您文件和开始、结束行。