Git和GitHub都显示SHA的短版本--仅显示前7个字符而不是全部40个字符--并且Git和GitHub都支持将这些短SHA作为参数。
例如:git show 962a9e8
例如:https://github.com/joyent/node/commit/962a9e8
考虑到可能性空间现在要低几个数量级,"只有" 2.68亿,Git和GitHub如何防止哈希碰撞?他们如何处理这些冲突?
Git和GitHub都显示SHA的短版本--仅显示前7个字符而不是全部40个字符--并且Git和GitHub都支持将这些短SHA作为参数。
例如:git show 962a9e8
例如:https://github.com/joyent/node/commit/962a9e8
考虑到可能性空间现在要低几个数量级,"只有" 2.68亿,Git和GitHub如何防止哈希碰撞?他们如何处理这些冲突?
这些缩写仅仅是为了简化视觉识别和让你的生活更加容易。实际上,Git并没有截断任何内容,在内部所有的值都将处理为完整值。你可以方便地使用部分SHA-1值,只要它足够清晰且至少四个字符长:
只要你提供了前几个字符,Git就足够聪明地找出你所需要的提交,只要你的部分SHA-1值至少有四个字符长度且清晰无误,也就是说,当前存储库中只有一个对象以该部分SHA-1值开头。
我的存储库有一个提交记录,其ID为000182eacf99cde27d5916aa415921924b82972c
。
git show 00018
展示了修订版本,但是
git show 0001
打印
error: short SHA1 0001 is ambiguous.
error: short SHA1 0001 is ambiguous.
fatal: ambiguous argument '0001': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
(如果您好奇,它是git本身的git存储库的克隆;该提交是Linus Torvalds在2005年做出的。)
git rev-list --all --objects | grep ^0001
。获取可能的完整SHA1列表后,您可以对每个对象执行 git show
命令了解更多详细信息。 - Mikko Rantalainen这里有两个要点:
如果您在显示提交的 GitHub 页面的任何位置键入y,则会看到该提交的完整40字节。
这说明了emboss的观点:GitHub不会截断任何内容。
然而,自2010年以来,7个十六进制数字(28位)已经不够用了。
请参见Linus Torwalds本人的提交dce9648(2010年10月,git 1.7.4.4):
最初的默认值为7是来自git开发早期,那时7个十六进制数字已经非常多了(它涵盖了大约2.5亿个哈希值)。当时我认为,65000个修订版本已经很多了(这是我们即将在BK中达到的数量),每个修订版本通常会有5-10个新对象左右,所以一百万个对象就是一个很大的数字。
(BK = BitKeeper)
如今,内核甚至不是最大的git项目,即使内核也有大约220k个修订版本(比BK树大得多),我们接近200万个对象。在这一点上,7个十六进制数字仍然对于其中很多对象是唯一的,但当我们谈论对象数量和哈希值之间只有两个数量级的差异时,截断哈希值就会发生冲突。现在它已经远远不再是不现实的情况 - 它经常发生。
我们应该增加默认的缩写长度,因为原来的长度非常小,并且添加一种方式让人们在git配置文件中为每个项目设置自己的默认值。