git SHA依赖什么?

pra*_*avk 6 git

我想知道git SHA所依赖的所有参数是什么?我想除了提交的内容之外,还会有其他一些参数,例如时间戳等,SHA的构建依赖于此。

我对这取决于的所有此类参数都感兴趣。我也对所有这样的参数都相同或强制相同而导致两个人进行的任何两次提交的git SHA完全相同的情况感兴趣。

Sch*_*ern 5

对于一次提交,ID至少取决于...的校验和

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

如果您更改有关提交的任何内容,则提交ID也会更改。

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


在将Git与其他版本控制系统进行比较时,请记住,在许多流行的“可靠”系统中,例如Subversion或CVS,具有文件许可权的任何人都可以进入并且无法检测地更改中央存储库中的历史记录。使用Git时,将立即检测到这种篡改,因为它将更改所有下游提交ID,或者如果它们的暴力破解与ID匹配,则内容完全是胡说八道。

的SHA1碰撞可能性可能性已经考虑。长话短说,在冲突中,现有的对象会获胜。

SHA1意外发生的可能性非常小,我希望您支付小行星,宇宙射线和狼攻击保险。

如果地球上所有的65亿人都在编程,并且每一秒钟,每个人所产生的代码都相当于整个Linux内核历史记录(360万个Git对象)并将其推入一个巨大的Git存储库,则大约需要2年时间直到该存储库包含足够的对象,才有50%的可能性发生一次SHA-1对象冲突。您编程团队的每个成员在同一晚发生无关事件中被狼攻击并杀死的可能性更高。

认真地讲,还有更好的事情要担心,例如驱动器发生故障的几百分之一。您的备份情况如何?


Mat*_*dge 1

Git 存储库中存储了多种不同类型的对象。Blob 对象存储文件的原始数据,树对象存储文件模式(例如是否只读)、对象类型和名称。

您可以在Git 社区书籍中找到更多详细信息

哈希值如此之多,意外冲突的可能性微乎其微。

但是,真正相同的内容将具有相同的哈希值:因此,如果两个人独立地对文件进行相同的更改,则两个(相同的)blob 对象将具有相同的哈希值;提交对象将不同并且具有不同的哈希值,但两次提交将引用相同的 blob 哈希值。如果稍后合并这两个提交,则只会保留该 blob 的一份副本(这很好,因为内容是相同的)。