git SHA取决于什么?

时间:2015-09-29 22:07:41

标签: git

我想知道git SHA所依赖的所有参数是什么?我猜测会有一些其他的参数,比如timestamp等,除了提交的内容,SHA的构造依赖于它。

我对所依赖的所有这些参数感兴趣。我也对所有这些参数相同或强制相同的情况感兴趣,导致两个人在这个星球上做出的任意两次提交完全相同的git SHA。

2 个答案:

答案 0 :(得分:4)

For a commit, the ID depends on checksums of at least ...

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

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

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

在将Git与其他版本控制系统进行比较时,请记住,在许多流行的“可靠”系统(如Subversion或CVS)中,具有文件权限的任何人都可以进入并且无法在中央存储库中更改历史记录。使用Git,将立即检测到这种篡改,因为它将更改所有下游提交ID,或者如果他们brute force matched the IDs内容完全是无意义的。

possibility of a SHA1 collision possibility has already been considered。长话短说,在冲突中现有的对象获胜。

The probability of a SHA1 collision happening accidentally is so vanishingly small,我希望你的小行星,宇宙射线和狼攻击保险已经付清。

  

如果地球上所有65亿人都在进行编程,而且每一秒都会产生相当于整个Linux内核历史(360万Git对​​象)并将其推入一个巨大的Git存储库的代码,那么它将需要大约2年,直到该存储库包含足够的对象以使单个SHA-1对象发生碰撞的概率为50%。你的编程团队的每个成员都会在同一天晚上被无关紧要的事件中的狼群攻击并杀死。

说真的,有更好的事情需要担心,比如驱动器出现故障的概率为百分之一。你的备份怎么样?

答案 1 :(得分:1)

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

您可以在Git Community Book

中找到更多详细信息

有很多哈希值,意外碰撞的可能性很小。

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