本手册编写用于描述 Subversion 1.1。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并参阅适合您 Subversion 版本的书籍版本。

Subversion 的功能

在讨论 Subversion 为版本控制带来的功能时,通常有助于从它们如何改进 CVS 的设计来谈论。如果您不熟悉 CVS,您可能无法理解所有这些功能。如果您根本不熟悉版本控制,除非您先阅读 第 2 章,基本概念,其中我们对版本控制做了一个简要的介绍,否则您的眼睛可能会变得呆滞。

Subversion 提供

目录版本控制

CVS 仅跟踪单个文件的历史记录,但 Subversion 实现了一个“虚拟”版本化文件系统,它随着时间的推移跟踪整个目录树的变化。文件 目录都是版本化的。

真正的版本历史

由于 CVS 仅限于文件版本控制,因此诸如复制和重命名之类的操作(可能发生在文件上,但实际上是某些包含目录内容的更改)在 CVS 中不受支持。此外,在 CVS 中,您无法用相同名称的新事物替换版本化的文件,而不会使新项目继承旧文件的历史记录——也许完全不相关——文件。使用 Subversion,您可以添加、删除、复制和重命名文件和目录。并且每个新添加的文件都从一个全新的历史开始。

原子提交

一组修改要么完全进入存储库,要么完全不进入。这允许开发人员将更改构建并提交为逻辑块,并防止仅将部分更改集成功发送到存储库时可能发生的问题。

版本化的元数据

每个文件和目录都有一组与其关联的属性——键及其值。您可以创建和存储您想要的任何任意键值对。属性随时间推移进行版本控制,就像文件内容一样。

网络层的选择

Subversion 对存储库访问有一个抽象的概念,使人们可以轻松地实现新的网络机制。Subversion 可以作为扩展模块插入到 Apache HTTP Server 中。这使 Subversion 在稳定性和互操作性方面具有很大优势,并且可以立即访问该服务器提供的现有功能——身份验证、授权、线路压缩等等。还提供了一个更轻量级的独立 Subversion 服务器进程。该服务器使用自定义协议,该协议可以轻松地通过 SSH 隧道传输。

一致的数据处理

Subversion 使用二进制差异算法来表达文件差异,该算法在文本(人类可读)和二进制(人类不可读)文件上都相同。这两种类型的文件在存储库中以相同的方式压缩存储,并且差异在网络上传输到两个方向。

高效的分支和标记

分支和标记的成本不必与项目大小成正比。Subversion 通过简单地复制项目来创建分支和标记,使用与硬链接类似的机制。因此,这些操作只需花费很少的时间,而且时间是恒定的。

可破解性

Subversion 没有历史包袱;它被实现为一组具有明确定义的 API 的共享 C 库。这使得 Subversion 非常易于维护,并且可以被其他应用程序和语言使用。