我读到ZFS和Btrfs使用校验和来防止数据降级,并且我读到Git通过对每次提交基本上散列所有内容而具有完整性。
我打算在带有Btrfs RAID 1的Linux NAS上使用Git服务器进行存储,但是如果Git具有完整性,我想就没有必要了(至少,如果我只想防止数据降级,则不需要这样做)。
问题: Git的完整性通过每次提交基本上散列了所有内容,是否可以防止或帮助防止位腐烂?
我读到ZFS和Btrfs使用校验和来防止数据降级,并且我读到Git通过对每次提交基本上散列所有内容而具有完整性。
我打算在带有Btrfs RAID 1的Linux NAS上使用Git服务器进行存储,但是如果Git具有完整性,我想就没有必要了(至少,如果我只想防止数据降级,则不需要这样做)。
问题: Git的完整性通过每次提交基本上散列了所有内容,是否可以防止或帮助防止位腐烂?
Answers:
Git的哈希仅在创建提交时发生,并从那里开始使用散列来标识提交。这绝不能确保文件的完整性。Git仓库可能会损坏并丢失数据。实际上,git有一个内置命令来检测这种丢失,即git fsck,但是正如文档所述,您有责任从备份中还原所有损坏的数据。
fsck
对我来说总是看起来像个坏话...我想如果结果是肯定的,尽管您没有一个合适的备份;)
取决于您所说的“预防”。
(首先,bit-rot是一个具有多个定义的术语。这个问题不是关于代码由于缺乏维护而变得无法运行。)
如果您用“预防”的意思是说它很可能会检测到由于位衰变而引起的损坏,那将是可行的。它将但是不能帮助解决腐败:哈希只提供错误检测,而不是修正。
通常,这就是“完整性”的含义:检测到数据未经授权/无意操纵的可能性,而非防止或纠正数据的可能性。
通常,您仍然需要RAID1和备份(可能是通过ZFS快照或类似的方式实现的,我对RAID1 +快照上的ZFS语义不熟悉),原因如下:
如果磁盘发生致命故障,则需要RAID1(或最近的备份)来还原数据。除非它具有数据的完整副本(RAID1),否则任何纠错都无法纠正整个磁盘故障。对于短时间的停机,您基本上必须具有RAID1。
如果您不小心删除了存储库的部分或全部,则需要备份(RAID1不能保护您,因为它会立即反映所有设备的更改)
本身仅具有两个磁盘的块级RAID1(例如,通过LVM或类似设备)将无法保护您免受数据的静默衰减:RAID控制器无法知道两个磁盘中的哪个存储了正确的数据。您需要其他信息,例如文件校验和。这就是ZSF和BTRFS校验进来:他们可以使用(这是不是说他们是在这些情况下使用,我不知道ZFS的btrfs或如何处理事情出现)来区分这两个盘的持有正确的数据。
防止位腐烂
不,完全没有。git没有引入类似RAID的冗余。如果目录中的.git
文件发生位腐烂,您将像往常一样丢失东西。
帮助防止腐烂?
是的...不。它无助于防止发生位腐烂,但有助于检测到位腐烂。但是在正常使用期间,它绝不会通过自己的帐户来这样做(很显然,当您签出某些对象等等时,它确实会这样做,但不是出于您的历史记录)。您将必须创建cron作业,以根据内容重新计算哈希并将它们与实际哈希进行比较。这样做很琐碎,因为git
散列实际上只是内容散列,重新计算它们并git fsck
为您这样做很简单。但是,当它检测到位腐烂时,就没有特别的措施可以对抗它。具体来说,由于较大的块会自动压缩,因此如果翻转较大的对象中的某个位,您很可能会导致全部块丢失。