我环顾四周,不确定这是否可行,但是这里有:
我有一个(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-log和gitdiffcore.我相信这个命令可以做到,但它可能不太正确:
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 =",并且将突出显示添加或删除包含该字符串的行的任何提交.
如果您稍微调整@ 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头,但我不知道一个.