52

我阅读了颠覆书,我很清楚颠覆不存储单个文件,而只存储增量以最小化磁盘空间。Subversion 也对二进制文件做同样的事情(这曾经是 CVS 的一个巨大弱点)。

但是我不明白确切的机制。当我提交文件时会发生什么?

  1. Subversion 仅存储差异(并且已经有旧版本)
  2. Subversion 删除以前的版本,完整地存储新文件并创建反向差异,以便在需要时“重新创建”旧版本。
  3. 还有一些我没有想到的。

第一种情况似乎是最合乎逻辑的。然而,这提出了另一个问题。如果我在 subversion 存储库中有一个包含 1000 次提交的文件并且新开发人员签出了一个干净的副本,那么 subversion 必须获取原始版本(初始导入)并在返回结果之前对其应用 1000 个差异。它是否正确?是否对保存最新版本的文件进行某种缓存?

基本上我在哪里可以找到关于 svn 存储库内部的信息?

更新:显然,颠覆的后端在这方面发挥了重要作用。当时或编写 FSFS 使用选项 1,而 BDB 使用选项 2。感谢 msemack!

4

5 回答 5

15

因为 Subversion 的存储库格式完全是内部的,所以他们可以自由地将表示从一个版本更改为下一个版本。我相信当前版本通常存储反向增量(您的选项 2),但也定期存储完整的快照,因此它不必在返回结果之前解决 1000 个差异。

Subversion 1.6 发行说明有一个关于文件系统存储改进的部分,其中有一些说明,并链接到其他来源。可以说,Subversion 数据存储的细节很复杂,并且可能会发生变化。

Subversion 源代码树中还有一个设计文档,描述了在 Subversion 中使用跳过增量。通常,/notes/目录包含几个关于 Subversion 内部的有用文档。

于 2010-02-25T09:21:01.843 回答
9

Subversion Design文档(虽然已经过时了),你可以得到:

像许多其他版本控制系统一样,Subversion 将更改存储为差异。它不会制作节点的完整副本;相反,它将最新修订存储为全文,并将以前的修订存储为一系列反向差异(“diff”一词在这里使用松散——对于文件,它意味着 vdeltas,对于目录,它意味着一种格式,它表示对目录)。

我不认为那是从那以后改变的。

另外,请参阅起泡法

于 2010-02-25T09:24:49.377 回答
9

我相信以下链接将有助于理解 fsfs 架构

http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_fs_fs/structure

于 2011-10-06T13:33:26.167 回答
3

常规的FSFS规范可能会对您有所帮助。

或者,如果您使用 Berkeley DB,请参阅此处的规范。

FSFS 使用反向增量来存储更改并使用跳过增量来加快某些操作,如果我理解正确的话。

于 2010-02-25T09:47:36.553 回答
1

每次提交更改时,存储库都会存储整个存储库树的新修订,并用新的修订号标记新树。当然,树的大部分内容与之前的修订版相同,除了您更改的部分。

新修订号是一个顺序标签,适用于整个新树,而不仅仅是您在该修订中触及的文件和目录。但是,通俗地说,修订号用于指代在该修订中提交的更改;例如,“r588 中的更改”(“r588”是“revision 588”的简写)实际上意味着“存储库树 587 和 588 之间的差异”,或者换句话说,“对树 587 所做的更改以生成树 588 ”。

看看:Subversion 常见问题解答

于 2010-02-25T09:25:27.333 回答