Linus谈话 - Git与数据损坏?

时间:2011-11-12 13:04:11

标签: git version-control

我看着Linus(git的创造者)给了talk on git。有一次他谈到git如何更安全。他还说其他SCM无法处理数据损坏。所以我用Google搜索并发现这不是真的。

例如,这个link谈到“完全用新提交替换违规提​​交,重新创建大致相同的更改。”

也许我误解了他,不知道他的意思是什么?

他说,很多时候,git是唯一的SCM,可以让你查看你输入的相同数据。

2 个答案:

答案 0 :(得分:4)

Linus指的是git提交可通过哈希识别的事实。

Git树是由多个(树,blob)组成的对象(读取:blob = file ,粗略地说)。

父节点的加密散列是递归地所有底层树/ blob的散列的散列。这样的树被称为Merkle (Hash) Trees,并且具有有趣的属性,即顶层散列是一个加密强哈希,它唯一地标识整个树。

请注意,哈希包含提交属性,其中包括父ID。也就是说,如果某个修订版中的某个文件发生了变化,则blob的哈希值会发生变化,因此包含树的哈希值会发生变化,快照的哈希值(根树)会发生变化,提交的哈希值会发生变化,任何子提交的哈希都需要改变等等。所有历史都将被改变。

如果违反了这些规则中的任何规则,那将很容易被发现:

  • 单个树的哈希在O(n)中是确定性可验证的,其中n是根树中对象的数量
  • 在O(n)中确定性地验证完整分支历史的完整性,其中n是修订链中的节点数。

实际上,git-verify-taggit fsck是显式执行检查的有用命令。除此之外,验证会自动发生在git子命令(send-pack,receive-pack,read-tree,write-tree等)上。

Re:替换有问题的提交线程

在第一个post by Linus中,他已经解构/解散了炸弹:

  

嗯。害怕。 应该是一个腐败的回购成功。

     

除非您已经完成了.grafts文件以隐藏损坏或其他内容   那样的?

Denis Bueno在回复中立即确认了这一点。

答案 1 :(得分:3)

我认为他指的是git使用加密哈希来确保数据正确性,并且它存储快照而不是更改集。说git是唯一这样做的SCM,今天可能是一种夸大其词,但在DVCS系统出现之前,它可能在过去也是如此。请注意,术语“快照”并不意味着它存储整个文件。 See this answer for details