一个Git SHA值依赖于什么?

11

我想知道git SHA取决于哪些参数?我猜在构建SHA时,除了提交的内容之外,还有一些其他参数,比如时间戳等。

我对所有这些参数都很感兴趣。我还对这样的情况很感兴趣,即所有这些参数都相同,或者被强制为相同,导致由两个人进行的任何两次提交产生完全相同的git SHA。

2个回答

13

更新: 我写了更详细的答案


对于提交而言,ID取决于至少以下内容的校验和...

  • 树(所有文件和目录)ID,由以下内容组成:
    • 所有文件的内容,而不是差异,称为blob。
    • 目录树(文件和目录的名称以及它们的组织方式)。
    • 所有文件和目录的权限。
  • 父提交ID。
  • 日志消息。
  • 提交者姓名、电子邮件和日期。
  • 作者姓名、电子邮件和日期。

如果您改变提交的任何内容,提交ID都会发生变化。

包括父提交ID非常重要。这意味着具有完全相同内容但构建在不同父级上的两个提交仍将具有不同的ID。为什么要这样做?这意味着如果两个提交的ID相同,则知道它们的整个历史记录相同。这使得比较和更新Git存储库非常有效。"我在提交ABC123处有分支foo,你也有吗?太好了,我们同步了!"


当将Git与其他版本控制系统进行比较时,请记住,在许多流行的“可靠”系统(如Subversion或CVS)中,具有文件权限的任何人都可以进入并在中央存储库中无法检测地更改历史记录。使用Git,这种篡改将立即被检测到,因为它将更改所有下游提交ID,或者如果它们 强制匹配了ID,则内容将完全无意义。 已经考虑到了SHA1冲突的可能性。长话短说,在冲突中,现有对象获胜。 SHA1碰撞的概率是如此微乎其微,我希望您的小行星、宇宙射线和狼袭击保险已经付清。
如果地球上的65亿人都在编程,并且每一秒钟,每个人都在生产相当于整个Linux内核历史(3.6百万个Git对象)的代码,并将其推送到一个巨大的Git存储库中,则需要大约2年时间,直到该存储库包含足够的对象,以具有单个SHA-1对象碰撞50%的概率。更高的可能性是您的编程团队的每个成员将在同一晚上遭到无关袭击并被狼杀死。

认真地说,还有更好的事情可以担心,例如100分之一的驱动器故障几率。你的备份怎么样?


1
在 Git 存储库中,有几种不同类型的对象。Blob 对象存储文件的原始数据,而 Tree 对象存储文件模式(例如是否只读)、对象类型和名称。
您可以在 Git 社区书籍 中找到更多详细信息。
由于哈希值很多,意外冲突的机会非常小。
然而,真正相同的内容将具有相同的哈希:因此,如果两个人独立地对文件进行相同的更改,则两个(相同的) Blob 对象将具有相同的哈希;提交对象将不同,并且将具有不同的哈希,但是两个提交都将引用相同的 Blob 哈希。如果这两个提交稍后合并,则仅保留一个 Blob 副本(这很好,因为内容相同)。

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