我环顾四周,并不确定这是否可行,但这里有:
我有一个(javascript)文件(例如/lib/client.js),其中我有一个唯一的标识符分配给变量,如下所示:
var identifier = "SOME_IDENTIFIER";
您可以将标识符视为版本号:我们会定期将此变量更改为新标识符。
我想要做的是找到我们曾经使用的所有唯一标识符。我怎么能用git做到这一点?
我想可能有办法搜索git历史记录,并打印匹配"var identifier ="
的行。我可以手动删除这个列表。
无论如何,我很欣赏这里的任何见解。感谢。
答案 0 :(得分:81)
从git 1.8.4 开始,有一种更直接的方式来回答你的问题。
假设行110
是var identifier = "SOME_IDENTIFIER";
行,那么请执行以下操作:
git log -L110,110:/lib/client.js
这将返回触及该行代码的每个提交。
[Git Documentation(参见" -L"命令行参数)]
答案 1 :(得分:42)
请参阅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
显示该提交的行和包含正则表达式的文件,前面带有提交哈希。
编辑:根据评论中的建议更改为使用-G
而不是-S
。
答案 2 :(得分:13)
您也可以使用gitk执行此操作:
gitk file.js
在“commit”下拉列表中,选择“添加/删除字符串:”,然后在其旁边的文本框中输入“var identifier =”,并且将突出显示添加或删除包含该字符串的行的任何提交
答案 3 :(得分:8)
如果你稍微调整@ 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标头,但我不知道一个。
答案 4 :(得分:2)