Git设计决定存储内容而不是差异

chi*_*ode 7 git

任何人都可以给我一些想法,为什么git开发人员做出设计决定来存储文件(blob)的内容,所以当内容更改时,需要创建一个新的blob?

我认为subversion存储修订而不是内容,所以当内容发生变化时,它只是跟踪两者之间的差异.难道git也不是这样做的吗?存储内容而不是修订版有什么好处?

Bev*_*van 11

我找不到快速谷歌的答案,但我相信它归结为一个简单的"它没关系'导致磁盘空间便宜".

在源代码管理工具中存储修订版很棘手.如果您只存储先前版本和当前版本之间的差异,则最终会出现两个问题:

  1. 返回最新版本(常见情况)需要最多的工作,因为代码需要通过将每个修订组合在一起来组装该修订.
  2. 对一个修订版的任何错误(例如,磁盘故障)都会破坏对每个后续版本的访问.

我相信大多数现代VCS实际上存储了最新版本(出于性能原因),如果使用差异,它们会被用来回溯,而不是前进.


Gre*_*ill 5

解决此(及相关)问题的文章是Repository Formats Matter.这是影响我几年前搬到Git的决定的文章之一.这是一段摘录:

鉴于这一论点,我应该清楚我认为git的存储库结构比其他存储库结构更好,至少对于X.org的使用模型而言.它似乎拥有几个有趣的属性:

  1. 永远不会修改包含对象数据的文件.一旦写入,每个文件从那一点开始是只读的.

  2. 压缩是离线完成的,可以延迟到主要对象保存到备份媒体之后.此方法提供比任何增量方法更好的压缩,允许在磁盘上重新排序数据以匹配使用模式.

  3. 对象数据本质上是自我检查的; 您无法在第一次引用对象时修改存储库中的对象并转义检测.