本文档是为描述 Subversion 1.2 而编写的。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并参考适合您 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 非常易于维护,并且可以被其他应用程序和语言使用。