Git(Hub)如何处理来自短SHA的可能冲突?
Git和GitHub都显示SHA的短版本——只有前7个字符而不是全部40个字符——并且Git和GitHub都支持将这些短SHA作为参数 例如,Git(Hub)如何处理来自短SHA的可能冲突?,git,cryptography,github,sha,Git,Cryptography,Github,Sha,Git和GitHub都显示SHA的短版本——只有前7个字符而不是全部40个字符——并且Git和GitHub都支持将这些短SHA作为参数 例如,git show 962a9e8 例如 考虑到可能性空间现在比“just”低了几个数量级,Git和GitHub在这里如何防止冲突?它们是如何处理的?我有一个存储库,它有一个id为000182eacf99cde27d5916aa415921924b82972c的提交 git show 00018 显示修订,但 git show 0001 印刷品 erro
git show 962a9e8
例如
考虑到可能性空间现在比“just”低了几个数量级,Git和GitHub在这里如何防止冲突?它们是如何处理的?我有一个存储库,它有一个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并没有真正截断任何内容,在内部,所有内容都将使用完整值进行处理。您可以在方便的时候使用部分SHA-1,但是: Git非常聪明,只要您的部分SHA-1至少有四个字符长且不含糊,就可以知道您要键入什么commit,也就是说,当前存储库中只有一个对象以该部分SHA-1开头 这里有两个注释:
- 如果在显示提交的GitHub页面的任意位置键入y,您将看到所述提交的完整40字节。
这说明了他的观点:GitHub不会截断任何东西 - 自2010年以来,7个十六进制数字(28位)是不够的。
见Linus Torwalds本人(2010年10月,git 1.7.4.4):
这在GitHub级别上不会引起关注,因为sha1对于每个单独的项目都是唯一的。两个7字符的短sha1仍然完全有可能在单个项目中发生冲突。有人知道是否有可能通过GitHub的API通过短SHA获取提交。。。例如,返回我需要的提交,但不感谢!该链接进一步阐述:“Git可以为您的SHA-1值找出一个简短、唯一的缩写。如果您将
--abbrev commit
传递给Git log命令,则输出将使用较短的值,但保持其唯一性;它默认使用七个字符,但如果需要,会使它们变长,以保持SHA-1的明确性。”另一句有用的话:“一般来说,8到10个字符就足以在一个项目中保持唯一性。最大的Git项目之一Linux内核开始需要40个字符中的12个字符才能保持唯一性。”您的链接已断开…:(如果您需要知道哪些对象与您不明确的id相匹配(0001
),你可以做git rev list--all--objects | grep^0001
。在你有了可能的完整sha1列表之后,你可以为每个sha1做git show
。展示了如何只用git命令消除歧义。我很好奇,最大的git项目是什么?或者至少,绝对大规模的git回购的一些最好的例子是什么?@GeorgeMillo如中所述,您有两种大型回购(大型历史或大型二进制文件)大型git回购的一个例子是Facebook回购:(从那时起他们切换到自己版本的Mercurial)您的意思是7个十六进制数字(28位),不是7位。@ThomasJacob谢谢。我已经相应地编辑了答案。@ThomasJacob注意:SHA1并不总是Git中使用的默认哈希算法。这是不断发展的: