在git blame命令中使用与其他命令相同的提交缩写长度

4
git blame 命令会显示提交哈希值,其长度比其他命令多一个字符。例如:
$ git log --oneline       
9fb6f706 (HEAD -> master) second commit
0af747a8 first commit
$ git blame foo   
9fb6f7064 (gilles 2020-11-15 12:28:09 +0100 1) revised
^0af747a8 (gilles 2020-11-15 12:27:41 +0100 2) world

我经常从'blame'命令的输出中复制一个缩写的散列值,并在日志或交互式重新排序的提交集中搜索它。但因为在'git blame'输出中,这个缩写多了一个字符,所以我必须记住删除最后一个字符,否则搜索找不到任何东西。

对于脚本编写,我会使用完整的哈希值和精美的格式。但是对于交互使用,我想使用缩写的哈希值。

设置 'core.abbrev' 选项没有帮助:'git blame' 会将其加1。设置 'core.abbrev' 并使用比它小一的值调用 'blame --abbrev' 可以解决问题,但这不是一个好的解决方案,因为我失去了 git 确定短提交 ID 的良好长度的启发式方法的好处,而且我必须显式地传递此选项或使用不同的命令名称作为别名。

如何使普通的 'git blame' 命令使用与其他 git 命令相同的缩写提交 ID 长度?


很有趣...也许是个bug?我可以确认最新的从源代码构建的Git表现出了这种行为。你能把这个问题带到Git邮件列表中吗? - knittl
1
@knittl 这是有意为之的设计:“需要一个更多的缩写长度来边界提交”。但这只适用于大多数无用的极端情况(边界提交可以通过其他方式识别),而且很烦人,所以我正在寻找一种解决方法。 - Gilles 'SO- stop being evil'
2
根据源代码,看起来你真的无法绕过它(嗯,我想你可以使用别名来调用带有明确缩写计数的“git blame”)。你可以尝试养成从所有搜索中始终删除最后一个字符的习惯。 :-) - torek
非常烦人,寻找责备的哈希提交,浪费了很多时间才意识到责备哈希有一个额外的字符。 - Sérgio
1个回答

1
感谢您查看源代码。恐怕您唯一的解决方案 - 或者说是权宜之计 - 是定义一个自定义别名。
git config --global alias.blame2 '!git -c core.abbrev=6 blame'

虽然我仍然不知道为什么 blame(或在blame中的“boundary commits”)需要不同的缩写长度。 只要缩写有足够的数字,它就已经是唯一的了。 我仍然建议将此发送到Git邮件列表。 - knittl
这在引入+1的提交消息中有解释:边界提交显示为^1234567而不是12345678,git计算长度以确保12345678是唯一的,但1234567不保证是唯一的。我并不认为这个特殊情况值得麻烦,但我必须接受它。 - Gilles 'SO- stop being evil'
1
@Gilles'SO-stopbeingevil': 是的,但唯一性不受提交是否为边界提交的影响。无论提交是否为边界提交,7个字符足以确保唯一性,或者8个字符也可以。如果7个字符不能唯一地标识单个提交——即哈希前缀不明确——那么即使对于git log,也必须显示超过7个字符。 - knittl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接