我现在已经多次听到过这种情况,Git提供了数据完整性.但是,这是什么意思?
我知道git中的所有对象都是使用SHA-1校验和访问的,并且该校验和是根据文件的内容计算的.这意味着如果文件有更改,您将获得不同的校验和.
但是,它如何提供数据完整性?如果我查找一些基于校验和(密钥)的数据,如果找不到它(如果它已经以某种方式被破坏)将git返回错误.我假设使用git时数据仍然会被破坏 - 磁盘读取错误等.
不要在这里真正看到与SVN的区别,或者在Git中实际上是如何提供数据完整性的.
但这如何提供数据完整性呢?如果我根据校验和(密钥)查找一些数据,如果未找到(如果它已损坏),git 将返回错误。
是的。
我所说的数据并不仅仅指文件的内容,而是完整的历史记录(即,如果给定文件版本的父版本发生更改,则与 Git 存储库关联的所有 SHA1 都会发生更改。数据仍然存在) ,但其历史的其他部分已经改变。
我认为使用 git 时数据仍然可能被损坏 - 磁盘读取错误等。
这是腐败的一个例子。
但即使数据保持完整,完整性也会反对任何更改(即使在作者或提交者姓名或日期等元数据中:更改其中之一,SHA1 也会更改)
这是因为组成 git 存储库的数据的DAG 图:

(图片来自《Git 内部原理 - Git 对象》)
如果您修改其中任何一项,它们的父级也会发生变化。
如果我查找一些基于校验和(密钥)的数据,如果找不到它(如果它已经以某种方式被破坏)将git返回错误.
基本上,是的.假设原始的正确数据校验和为1234.Git存储该校验和并通过该校验和查找数据.(这就是它的"内容可寻址"的工作原理:一般通常以例如一个分支名称开头master,它映射到一个提交ID就好56789ab....这个映射保存在git的"refs"中,它比其他的更容易受到攻击.数据,但我们暂时假设这部分保持不变.)
然后,Git按ID提取提交,并将内容的校验和与ID进行比较.这必须匹配,否则提交内容已损坏.假设内容有效,它们包含一个(单个)树ID(以及有关提交的信息:由谁创建,何时,其父项等).
Git然后按ID提取树内容,并将内容的校验和与ID进行比较.这必须匹配,否则树内容已损坏.假设内容有效,它们包含一系列给出文件模式,名称和ID的元组.对于每一行,模式区分其他树或普通文件("blob").名称是子树或文件的名称,ID是内容的校验和.
然后,Git按ID提取子树或blob内容,并比较校验和.这必须匹配,否则内容已损坏.假设内容有效,则像以前一样递归地处理子树,并且文件是正确的(不妥协).
请注意,在此过程中,任何捕获的错误只会告诉您出现了问题,但它无法解决问题; 为此,您需要备份(例如存储库的另一个副本).如果故障在整个过程中发生得相当远,那么很明显它是腐败的数据,因为校验和有效的时间足以在失败之前找到提交和树以及可能的几个子树.
如果引用已损坏,则很难重构.但是,git可以遍历数据库中的每个对象,并查看是否有任何"未引用".这些对象是损坏的引用应该指向的对象.实际上,在实践中修复它通常是毫无意义的:你只需要使用在损坏的blob情况下使用的相同备份.
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |