【发布时间】:2021-04-11 13:11:28
【问题描述】:
我有很多文件的提交。我想在所有删除中搜索一个字符串(或正则表达式),并显示一个包含匹配项的文件列表(最好是删除的相关摘录)。
使用git log -p -S 'string',我可以滚动并搜索所有更改,但我不知道如何将输出限制为某个提交,并且我无法提前过滤删除(我可以使用^- 开始我的正则表达式,但是太乱了)。
【问题讨论】:
我有很多文件的提交。我想在所有删除中搜索一个字符串(或正则表达式),并显示一个包含匹配项的文件列表(最好是删除的相关摘录)。
使用git log -p -S 'string',我可以滚动并搜索所有更改,但我不知道如何将输出限制为某个提交,并且我无法提前过滤删除(我可以使用^- 开始我的正则表达式,但是太乱了)。
【问题讨论】:
使用
git log -p -S 'string'我可以滚动并搜索所有更改,但我不知道如何将输出限制为某个提交...
这部分很简单:git log 的主要功能是从某个特定的提交开始,一个接一个地遍历(向后,就像 Git 一样)提交。默认是从HEAD 提交开始,如果你没有指定从哪个提交开始,并且一直持续下去。但是如果你确实指定了一个特定的提交,它将从那里开始——并且,使用-n,你可以告诉它有多少提交要遍历,所以如果你将此设置为1,在完成您指定的一个提交后,它将“向后走”零次:
git log -n 1 -p -S 'string' <hash-id>
例如。
您也可以使用--no-walk 达到相同的效果。如果您想检查两个或三个特定的提交,这会更有用:
git log --no-walk -p -S 'string' <hash1> <hash2> <hash3>
例如。
而且我不能提前过滤删除(我可以用 ^- 开始我的正则表达式,但这很麻烦)。
在这里,git log 并没有多大帮助。但是,您可以将git log 的输出重定向到一个文件,然后使用任何合适的命令打开该文件,以便您轻松找到删除的内容(grep,您的编辑器等)。
请注意,^-.*<string> 并不意味着查找删除的更改,而是查找以- 开头的更改文本。除非您正在查看补丁文件本身,以便文件中的文本 以- 开头,否则这将无济于事。由git log 生成的- 作为所示补丁的一部分不包含在正则表达式搜索中,即使是--pickaxe-regex。
您可以考虑将git blame 与--reverse 一起使用。
【讨论】:
获得目标提交的哈希值后,您可以使用:
# to get the list of matches in that commit :
git grep -e 'string' hash
# to get the list of matches in that commit's parent :
git grep -e 'string' hash^
git grep 也有一个 -c 选项来打印每个文件的 count 个匹配项,而不是完整的行。
您可以将其用作脚本的输入:
如果您的意思是“搜索出现次数减少的所有文件”:逐个文件比较 git grep -c ...,并检查次数减少的文件
如果您的意思是“在全球出现次数下降的情况下继续提交”:将个人计数相加并进行比较
等等……
【讨论】: