我现在已经多次听到提到 Git 提供数据完整性。但是,这是什么意思?
据我所知,git 中的所有对象都是使用 SHA-1 校验和来访问的,并且该校验和是根据文件的内容计算的。这意味着如果文件发生更改,您将得到不同的校验和。
但这如何提供数据完整性呢?如果我根据校验和(密钥)查找某些数据,如果未找到(如果它已损坏),则 git 将返回错误。我认为使用 git 时数据仍然可能被损坏 - 磁盘读取错误等。
真的看不出有什么区别,例如此处的 SVN 或 Git 中如何实际提供数据完整性。
如果我根据校验和(密钥)查找某些数据,如果未找到(如果它已损坏),则 git 将返回错误。
本质上是的。假设原始正确数据的校验和为1234。Git 存储此校验和并通过该校验和查找数据。 (这就是它的“内容可寻址”的工作原理:通常以分支名称开头,例如master
,它映射到一个提交 ID,例如56789ab...
。该映射保存在 git 的“refs”中,它比其他数据更容易受到攻击,但我们暂时假设这部分保持不变。)
然后 Git 通过 ID 提取提交,并将内容的校验和与 ID 进行比较。这必须匹配,否则提交内容会损坏。假设内容有效,它们包含一个(单个)树 ID(加上有关提交的信息:谁制作的、何时制作、其父级等等)。
然后 Git 通过 ID 提取树内容,并将内容的校验和与 ID 进行比较。这必须匹配,否则树内容将被损坏。假设内容有效,它们包含一系列给出文件模式、名称和 ID 的元组。对于每一行,该模式区分附加树或纯文件(“blob”)。名称是子树或文件的名称,ID 是内容的校验和。
然后 Git 通过 ID 提取子树或 blob 内容,并比较校验和。这必须匹配,否则内容会损坏。假设内容有效,子树像以前一样递归处理,并且文件是正确的(未受损)。
请注意,在此过程中,任何捕获的错误都只是告诉您出现了问题,但并不能解决问题;为此,您需要一个备份(例如存储库的另一个副本)。如果故障发生在整个过程中相当远的地方,很明显数据已损坏,因为校验和的有效时间足以在故障之前找到提交和树,也许还有几个子树。
如果参考文献被损坏,就很难重建。然而,git 可以遍历数据库中的每个对象并查看是否有“未引用”的对象。此类对象是损坏引用的候选对象should观点。实际上,解决这个问题通常是毫无意义的困难:您只需转到在损坏的 blob 情况下使用的相同备份即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)