本手册旨在介绍 Subversion 1.6.x 系列版本。如果您运行的是其他版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您的 Subversion 版本的手册。

什么是 Subversion?

Subversion 是一个免费/开源的版本控制系统 (VCS)。也就是说,Subversion 会随着时间的推移管理文件和目录,以及对它们的更改。这样您就可以恢复数据的旧版本,或检查数据更改的历史记录。在这方面,许多人将版本控制系统视为一种时光机。

Subversion 可以在网络上运行,这使得它可以被不同计算机上的人使用。在某种程度上,不同的人从各自的位置修改和管理同一组数据的这种能力促进了协作。在没有单个管道的情况下,进度可以更快地实现,所有修改必须通过该管道进行。由于工作是版本化的,因此您不必担心在失去该管道时会牺牲质量——如果对数据进行了一些不正确的更改,只需撤消该更改即可。

一些版本控制系统也是软件配置管理 (SCM) 系统。这些系统专门针对源代码树的管理,并且具有许多针对软件开发的特定功能,例如本机理解编程语言,或提供用于构建软件的工具。然而,Subversion 不是这些系统之一。它是一个通用系统,可以用来管理任何文件集合。对于您来说,这些文件可能是源代码——而对于其他人来说,任何东西都可能包括从购物清单到数字视频混音等等。

Subversion 是合适的工具吗?

如果您是考虑使用 Subversion 的用户或系统管理员,您应该首先问自己:“这是否适合这项工作的工具?” Subversion 是一个很棒的锤子,但要小心,不要把每个问题都看成钉子。

如果您需要归档文件的旧版本和目录,可能需要恢复它们,或检查它们如何随着时间的推移而更改的日志,那么 Subversion 就是您的正确工具。如果您需要与其他人协作处理文档(通常通过网络)并跟踪谁进行了哪些更改,那么 Subversion 也是合适的。这就是 Subversion 为什么经常在软件开发环境中使用的原因——在开发团队中工作本质上是一种社会活动,而 Subversion 使与其他程序员协作变得容易。当然,使用 Subversion 也有一些成本:管理开销。您需要管理一个数据存储库来存储信息及其所有历史记录,并认真地对其进行备份。在日常使用数据时,您将无法像往常一样复制、移动、重命名或删除文件。相反,您必须通过 Subversion 来完成所有这些操作。

假设您对额外的流程感到满意,您仍然应该确保您没有使用 Subversion 来解决其他工具可以更好地解决的问题。例如,由于 Subversion 将数据复制给所有参与的协作者,因此一个常见的误用是将其视为通用的分发系统。人们有时会使用 Subversion 分发大量照片、数字音乐或软件包。问题是,这类数据通常根本不会更改。集合本身会随着时间的推移而增长,但集合中的单个文件不会被更改。在这种情况下,使用 Subversion 是过分了。[2] 有一些更简单的工具可以有效地复制数据而不跟踪更改的开销,例如 rsyncunison

Subversion 的历史

在 2000 年初,CollabNet, Inc. (http://www.collab.net) 开始寻找开发人员来编写 CVS 的替代品。CollabNet 提供了[3] 一套名为 CollabNet Enterprise Edition (CEE) 的协作软件套件,其中一个组件是版本控制。尽管 CEE 使用 CVS 作为其最初的版本控制系统,但 CVS 的局限性从一开始就显而易见,CollabNet 知道它最终将不得不找到更好的东西。不幸的是,CVS 已成为开源世界中的事实上的标准,主要是因为没有比它更好的东西,至少在免费许可下没有。因此,CollabNet 决定从头开始编写一个新的版本控制系统,保留 CVS 的基本思想,但没有它的 bug 和错误功能。

2000 年 2 月,他们联系了 Karl Fogel,他是Open Source Development with CVS (Coriolis, 1999) 的作者,并询问他是否愿意参与这个新项目。巧合的是,当时 Karl 已经与他的朋友 Jim Blandy 讨论了设计一个新的版本控制系统。1995 年,他们两人共同创办了 Cyclic Software,这是一家提供 CVS 支持合同的公司,尽管他们后来出售了这家公司,但他们仍然在工作中每天都使用 CVS。他们对 CVS 的沮丧让 Jim 认真思考了管理版本化数据更好的方法,他不仅已经想出了 Subversion 的名字,而且还想出了 Subversion 数据存储的基本设计。当 CollabNet 打电话时,Karl 立即同意参与该项目,Jim 让他的雇主 Red Hat Software 基本上将他捐赠给该项目,时间不确定。CollabNet 聘用了 Karl 和 Ben Collins-Sussman,详细的设计工作于 2000 年 5 月开始。在 CollabNet 的 Brian Behlendorf 和 Jason Robbins 以及 Greg Stein(当时是活跃于 WebDAV/DeltaV 规范流程的独立开发人员)的帮助下,Subversion 迅速吸引了一个活跃的开发人员社区。事实证明,许多人遇到了与 CVS 相同的令人沮丧的经历,并欢迎有机会最终对此做些什么。

最初的设计团队制定了一些简单的目标。他们不想在版本控制方法论方面开拓新领域,他们只是想修复 CVS。他们决定 Subversion 将匹配 CVS 的功能,并保留相同的开发模式,但不会重复 CVS 最明显的缺陷。尽管它不需要成为 CVS 的直接替代品,但它应该足够相似,以便任何 CVS 用户都可以轻松地进行切换。

经过 14 个月的编码,Subversion 在 2001 年 8 月 31 日成为自我托管。也就是说,Subversion 开发人员停止使用 CVS 管理 Subversion 自己的源代码,而是开始使用 Subversion。

尽管 CollabNet 启动了该项目,并且仍然为大部分工作提供资金(它支付了几位全职 Subversion 开发人员的薪水),但 Subversion 的运行方式与大多数开源项目一样,受一套松散的、透明的规则管理,这些规则鼓励精英统治。2009 年,CollabNet 与 Subversion 开发人员合作,朝着将 Subversion 项目集成到 Apache 软件基金会 (ASF) 的目标努力,ASF 是世界上最著名的开源项目集合之一。Subversion 的技术根源、社区优先级和开发实践非常适合 ASF,ASF 的许多成员已经是活跃的 Subversion 贡献者。在 2010 年初,Subversion 完全被吸纳到 ASF 的顶级项目家族中,将其项目网页迁移到 https://subversion.org.cn,并更名为Apache Subversion.

Subversion 的架构

图 1,“Subversion 的架构” 说明了 Subversion 设计的高空 视图。

图 1。Subversion 的架构

Subversion's architecture

一端是 Subversion 存储库,它保存了您所有的版本化数据。另一端是您的 Subversion 客户端程序,它管理这些版本化数据的部分的本地反映。在这些极端之间是通过存储库访问 (RA) 层的多个路由,其中一些路由跨越计算机网络并通过网络服务器,然后访问存储库,而另一些路由则完全绕过网络并直接访问存储库。

Subversion 的组件

安装 Subversion 后,它会包含许多不同的部分。以下是您获得的内容的简要概述。如果简短的描述让您感到困惑,请不要惊慌——本书中还有很多页面专门用来消除这种困惑。

svn

命令行客户端程序

svnversion

一个用于报告工作副本状态(就当前项目中的修订版而言)的程序

svnlook

一个用于直接检查 Subversion 存储库的工具

svnadmin

一个用于创建、调整或修复 Subversion 存储库的工具

mod_dav_svn

Apache HTTP 服务器的插件模块,用于通过网络使您的存储库对其他人可用

svnserve

一个自定义的独立服务器程序,可以作为守护进程运行或由 SSH 调用;另一种通过网络使您的存储库对其他人可用的方法

svndumpfilter

一个用于过滤 Subversion 存储库转储流的程序

svnsync

一个用于通过网络将一个存储库增量镜像到另一个存储库的程序

Subversion 的新功能

本书的第一版由 O'Reilly Media 于 2004 年出版,当时 Subversion 刚发布 1.0 版本。从那时起,Subversion 项目一直在继续发布软件的新主要版本。以下是自 Subversion 1.0 版本以来主要新更改的简要概述。请注意,这不是完整的列表;有关完整详细信息,请访问 Subversion 的网站 https://subversion.org.cn

Subversion 1.1(2004 年 9 月)

1.1 版本引入了 FSFS,这是一种用于存储库的扁平文件存储库存储选项。虽然 Berkeley DB 后端仍然被广泛使用和支持,但 FSFS 由于其进入门槛低和维护要求最少,已成为新创建存储库的默认选择。此版本还带来了将符号链接置于版本控制之下的能力、URL 的自动转义以及本地化的用户界面。

Subversion 1.2(2005 年 5 月)

1.2 版本引入了在文件上创建服务器端锁的功能,从而对某些资源的提交访问进行序列化。虽然 Subversion 仍然是一个本质上并发的版本控制系统,但某些类型的二进制文件(例如艺术资产)无法合并在一起。锁定功能满足了对这类资源进行版本控制和保护的需要。随着锁定的出现,还带来了完整的 WebDAV 自动版本控制实现,允许将 Subversion 存储库挂载为网络文件夹。最后,Subversion 1.2 开始使用新的、更快的二进制差异算法来压缩和检索文件的旧版本。

Subversion 1.3(2005 年 12 月)

1.3 版本为 svnserve 服务器带来了基于路径的授权控制,与以前仅在 Apache 服务器中找到的功能相匹配。然而,Apache 服务器本身获得了一些新的日志记录功能,并且 Subversion 与其他语言的 API 绑定也取得了巨大的进步。

Subversion 1.4(2006 年 9 月)

Subversion 1.4 版本引入了全新的工具 — **svnsync** — 用于在网络上进行单向仓库复制。工作副本元数据的核心部分已重新设计,不再使用 XML (提高了客户端速度),同时 Berkeley DB 仓库后端获得了在服务器崩溃后自动恢复的功能。

Subversion 1.5 (2008 年 6 月)

Subversion 1.5 版本的开发时间比之前的版本都要长,但其核心功能却十分重要:半自动分支和合并追踪。这对用户来说是一项巨大的优势,它将 Subversion 的能力远远超越了 CVS,并跻身于 Perforce 和 ClearCase 等商业竞争对手之列。Subversion 1.5 还引入了大量其他面向用户的特性,例如交互式文件冲突解决、稀疏检出、客户端变更列表管理、强大的外部定义新语法以及对 **svnserve** 服务器的 SASL 身份验证支持。

Subversion 1.6 (2009 年 3 月)

Subversion 1.6 版本通过引入树冲突,继续增强分支和合并功能,并在其他现有功能方面进行了改进:更多交互式冲突解决选项;稀疏检出的去嵌套和完全排除支持;基于文件的外部定义;以及对 **svnserve** 的操作日志支持,类似于 **mod_dav_svn** 提供的功能。此外,命令行客户端引入了一种新的快捷语法,用于引用 Subversion 仓库 URL。



[2] 或者,就像一位朋友说的那样,"用别克拍苍蝇。

[3] CollabNet 企业版现已被名为 CollabNet TeamForge 的新产品线取代。