Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git中的数据完整性?_Git - Fatal编程技术网

Git中的数据完整性?

Git中的数据完整性?,git,Git,我已经多次听到这一点,Git提供了数据完整性。但这意味着什么 我知道git中的所有对象都是使用SHA-1校验和访问的,并且该校验和是根据文件内容计算的。这意味着,如果文件有更改,您将得到不同的校验和 但这如何提供数据完整性呢?如果我根据校验和(键)查找一些数据,如果找不到它(如果它已损坏),git将返回一个错误。我假设在使用git磁盘读取错误等时,数据仍然会损坏 这里没有看到SVN的区别,也没有看到Git实际上是如何提供数据完整性的 但这如何提供数据完整性呢?如果我根据校验和(键)查找一些数据,

我已经多次听到这一点,Git提供了数据完整性。但这意味着什么

我知道git中的所有对象都是使用SHA-1校验和访问的,并且该校验和是根据文件内容计算的。这意味着,如果文件有更改,您将得到不同的校验和

但这如何提供数据完整性呢?如果我根据校验和(键)查找一些数据,如果找不到它(如果它已损坏),git将返回一个错误。我假设在使用git磁盘读取错误等时,数据仍然会损坏

这里没有看到SVN的区别,也没有看到Git实际上是如何提供数据完整性的

但这如何提供数据完整性呢?如果我根据校验和(键)查找一些数据,如果找不到它(如果它已损坏),git将返回一个错误

说到数据,我指的不仅仅是文件的内容,而是完整的历史记录(即,如果给定版本的文件的父版本发生更改,则与Git repo相关的所有SHA1都会发生更改。数据仍然存在,但其历史记录的其他部分已发生更改

我假设在使用git磁盘读取错误等时,数据仍然会损坏

这是腐败的一个例子。
但即使数据保持完整,完整性也会受到任何更改的影响(即使在元数据中,如作者或提交人姓名或日期:更改其中一个,SHA1也会更改)

这是因为构成git回购协议的数据量很大:

(来自“”的图像)

如果修改其中任何一项,其父项也会发生更改

如果我根据校验和(键)查找一些数据,如果找不到它(如果它已损坏),git将返回一个错误

本质上,是的。假设原始正确的数据校验和为1234。Git存储此校验和,并通过该校验和查找数据。(这是其“内容可寻址”的方式)事情是这样的:一个通常以分支名开始,比如
master
,它映射到提交ID,比如
56789ab…
。这个映射保存在git的“refs”中,它比其他数据更容易受到攻击,但我们暂时假设这部分保持不变。)

Git然后按ID提取提交,并将内容的校验和与ID进行比较。这必须匹配,否则提交内容已损坏。假设内容有效,它们包含一个(单个)树ID(加上有关提交的信息:提交人、时间、其父级等)

Git然后按ID提取树内容,并将内容的校验和与ID进行比较。这必须匹配,否则树内容已损坏。假设内容有效,它们包含一系列元组,给出文件模式、名称和ID。对于每一行,模式区分其他树或普通文件(“BLOB”)。名称是子树或文件的名称,ID是内容的校验和

Git然后按ID提取子树或blob内容,并比较校验和。这必须匹配,否则内容已损坏。假设内容有效,子树将像以前一样进行递归处理,并且文件正确(未受损)

请注意,在此过程中,任何捕获到的错误都会简单地告诉您出了问题,但这并不能纠正问题;为此,您需要备份(例如存储库的另一个副本)。如果失败发生在流程的相当远的地方,很明显是数据损坏了,因为校验和的有效时间足够长,可以在失败之前找到一个提交和一棵树,可能还有几个子树


如果引用已损坏,则很难重建。然而,git可以遍历数据库中的每个对象,查看是否有“未引用”的对象。这些对象是损坏的引用应该指向的候选对象。实际上,修复这一点通常毫无意义地困难:您只需转到在发生损坏的blob时使用的相同备份。

@u123您可以在中看到它的描述:它是一个名为
bak/
的文件夹,其中包含与中相同的test.txtrepo的根文件夹。all模式说明了如何在Git中只存储一次具有相同内容的。