修订控制系统如何恢复修订?

时间:2012-05-28 10:40:44

标签: algorithm version-control diff git-diff

我的问题比标题中声明的更为通用。

我知道源版本控制仅存储有关差异的信息。 据我所知,维基百科也是如此,github也是如此。

但他们都有能力显示特定修订版的整个文件。他们是否会逐步将其从第一次修订恢复到特定版本?

还有一个问题。如果他们只存储差异,他们如何用上下文显示它们(更改前后的一点点文本)。

编辑: github存储整个快照而不是增量

3 个答案:

答案 0 :(得分:6)

  

我知道源版本控制仅存储有关差异的信息。

正如问题Git design decision on storing content rather than differences所示,这不是完全 Git的作用。
它确实具有“打包”格式,以使用来自LibXDiff库的二进制增量以deltaified形式存储对象。但这主要用于网络传输 请参阅“Is the git binary diff algorithm (delta storage) standardized?” 这就是为什么当你获取时git是“resolving delta”。

答案 1 :(得分:4)

有关存储版本控制数据的不同方式的优缺点的非常有趣的读物,我强烈建议阅读Eric Sink的文章Time and Space Tradeoffs in Version Control Storage

  

存储是版本控制最困难的挑战之一   系统。对于每个文件,我们必须存储每个版本   存在。版本控制存储库的逻辑大小永远不会   收缩。它只是不断增长和成长,以及每个旧版本   需要保持可用。

     

那么,存储每个版本的最佳方法是什么?

答案 2 :(得分:3)

维基百科,遗憾的是......将某些形式的XML(?)中的每个修订版本保留为文本。

看看wikipedia database schema。特别是最近的更改和文字。

因此,他们对“生物学”页面的第一个副本进行了精彩的O(1)查找。这有一个令人遗憾的副作用,导致维基百科technology cost从2010 - 2011年的800万美元增长到2011 - 2012年的1200万美元。尽管HDD(以及其他所有东西)变得越来越便宜,而且价格也越来越贵。

对于保存每个文件的修订控制如此之多。 Git采取了一种可爱的方法。见Is the git storage model wasteful?

它存储每个文件,类似于上面的方法。一旦回购所占用的空间超过一定限度,它就会进行强力重新包装(这是一个选项,用于设定它的尝试次数 - - 窗口= [N], - 深度= [N]),这可能需要数小时。它对所述重新打包使用delta和无损压缩的组合(递归delta,然后对你拥有的任何位应用无损)。

像SVN这样的其他人使用简单的delta压缩。 (从记忆中,你不应该相信)。

脚注: 增量压缩存储增量变化。 无损压缩非常像zip,rar等。