Apache Subversion 是一个功能齐全的版本控制系统,最初设计为比 CVS 更好的版本控制系统。Subversion 已经超越了最初取代 CVS 的目标,但其基本模型、设计和界面仍然受到该目标的很大影响。即使在今天,Subversion 对于 CVS 用户来说仍然感觉非常熟悉。
以下功能列表假设您,读者,对版本控制是什么以及版本控制系统如何工作有一个基本的了解。如果您正在寻找的功能列表中没有,请随时在我们的 项目邮件列表 上询问 - 也许我们只是没有想到在这里列出它。如果 Subversion 确实缺少您需要的功能,您的反馈将有助于我们改进 Subversion,同时,也许我们可以帮助您使用 Subversion 拥有的功能来满足您的需求。
CVS 是一个相对基本的版本控制系统。在大多数情况下,Subversion 在这些功能继续适用于 Subversion 的特定设计的情况下,已经匹配或超过了 CVS 的功能集。
Subversion 将目录作为一等公民进行版本化,就像文件一样。
复制和删除是版本化的操作。重命名也是版本化的操作,尽管有一些 怪癖。
Subversion 允许将任意元数据(“属性”)附加到任何文件或目录。这些属性是键值对,并且与它们附加到的对象一样进行版本控制。Subversion 还提供了一种方法来将任意键值属性附加到修订版(即提交的变更集)。这些属性没有版本控制,因为它们将元数据附加到版本空间本身,但它们可以随时更改。
提交的任何部分都不会生效,直到整个提交成功。修订号是针对每个提交的,而不是针对每个文件的,并且提交的日志消息附加到其修订版,而不是冗余地存储在该提交影响的所有文件中。
这些操作没有理由很昂贵,所以它们不是。
分支和标记都是根据底层的“复制”操作实现的。复制占用少量恒定的空间。任何复制都是一个标记;如果您开始在复制上提交,那么它也是一个分支。(这消除了 CVS 的“分支点标记”,通过消除最初使分支点标记成为必要的区别。)
Subversion 1.5 引入了合并跟踪:自动协助管理开发线之间的更改流程,以及将分支合并回其源代码。1.5 版本的合并跟踪对常见场景提供了基本支持;我们将在即将发布的版本中扩展此功能。
Subversion 支持(但不强制要求)锁定文件,以便在多个人尝试编辑同一个文件时可以警告用户。可以在编辑之前将文件标记为需要锁定,在这种情况下,Subversion 将以只读模式呈现文件,直到获取锁定。
Unix 用户可以在版本控制下放置符号链接。这些链接在 Unix 工作副本中重新创建,但在 win32 工作副本中没有重新创建。
Subversion 会注意到文件是否可执行,如果该文件被置于版本控制下,则在将其检出到其他位置时,其可执行性将得以保留。(Subversion 用于记住这一点的机制仅仅是 版本化属性,因此可执行性可以在必要时手动编辑,即使是从不承认文件可执行性的客户端(例如,在 Microsoft Windows 下具有错误扩展名时)。
Subversion 可以使用基于 HTTP 的 WebDAV/DeltaV 协议进行网络通信,并使用 Apache Web 服务器提供存储库端的网络服务。这使得 Subversion 在互操作性方面比 CVS 具有优势,并允许以管理员已经熟悉的方式提供某些功能(例如身份验证、线缆压缩)。
Subversion 提供了一个使用自定义协议的独立服务器选项,因为并非所有人都希望运行 Apache HTTPD 服务器。独立服务器可以作为 inetd 服务运行,也可以以守护进程模式运行,并提供与基于 HTTPD 的服务器相同的身份验证和授权功能。独立服务器也可以通过 ssh 隧道传输。
Subversion 命令行客户端的所有输出都经过精心设计,既可供人类阅读,也可供自动解析;可脚本化是重中之重。
Subversion 使用 gettext() 来显示翻译后的错误、信息和帮助消息,这些消息基于当前的区域设置。
Subversion 命令行客户端 (svn) 提供了多种方法来解决冲突更改,包括交互式解决提示。此机制也通过 API 提供,以便其他客户端(例如图形客户端)可以提供适合其界面的交互式冲突解决。
Subversion 提供了一个实用程序 svnsync,用于同步(通过推送或拉取)只读从属存储库与主存储库。
Subversion 1.5 引入了一个直写代理功能,允许从属存储库(参见 只读镜像)自行处理所有读取操作,同时将写入操作传递给主存储库。此功能仅适用于 Apache HTTPD(WebDAV)服务器选项。
Subversion 从一开始就被设计为客户端/服务器;从而避免了困扰 CVS 的一些维护问题。代码被组织成一组具有明确定义的接口的模块,这些模块旨在被其他应用程序调用。
Subversion 对二进制文件和文本文件同样高效,因为它使用二进制差异算法来传输和存储连续的修订版。
一般来说,Subversion 操作所需的时间与操作产生的更改大小成正比,而不是与发生更改的项目的绝对大小成正比。
Subversion API 提供了多种编程语言的绑定,例如 Python、Perl、Java 和 Ruby。(Subversion 本身是用 C 语言编写的。)
Subversion 1.5 引入了变更列表,允许用户将修改后的文件放到客户端的命名组中,然后通过指定特定组进行提交。对于那些在同一目录树中同时处理逻辑上独立的变更集的人来说,变更列表可以帮助保持事物的井然有序。
...即使我们设法保持此列表最新,也不可能列出每个小功能。有关更多信息,请参阅文档。