7. Subversion 是什么?

Subversion 是一个自由/开源的版本控制系统。也就是说,在 Subversion 管理下,文件和目录可以超越时空。也就是 Subversion 允许你数据恢复到早期版本,或者是检查数据修改的历史。正因为如此,许多人将版本控制系统当作一种神奇的时间机器

Subversion 的版本库可以通过网络访问,从而使用户可以在不同的电脑上进行操作。从某种程度上来说,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作。因为修改不再是单线进行,开发速度会更快。此外,由于所有的工作都已版本化,也就不必担心由于错误的更改而影响软件质量—如果出现不正确的更改,只要撤销那一次更改操作即可。

某些版本控制系统本身也是软件配置管理(SCM)系统,这种系统经过精巧的设计,专门用来管理源代码树,并且具备许多与软件开发有关的特性—比如,对编程语言的支持,或者提供程序构建工具。不过 Subversion 并不是这样的系统。它是一个通用系统,可以管理任何类型的文件集。对你来说,这些文件这可能是源程序—而对别人,则可能是一个货物清单或者是数字电影。

7.1. Subversion 是正确的工具吗?

如果你是一个考虑如何使用 Subversion 的用户或管理员,你要问自己的第一件事就是: "这是这项工作的正确工具吗?",Subversion 是一个梦幻般的锤子,但要小心不要把任何问题当作钉子。

如果你希望归档文件和目录旧版本,有可能要恢复或需要查看日志获得其修改的历史,那么 Subversion 是你需要的工具。如果你需要和别人协作文档(通常通过网络)并跟踪所做的修改,那么 Subversion 也适合。这是 Subversion 为什么使用在软件开发环境—编程是天生的社会活动,Subversion 使得与其他程序员的交互变得简单。当然,使用 Subversion 也有代价:管理负担。你会需要管理一个存放所有历史的数据版本库,并需要经常的备份。而在日常的工作中,你不能像往常一样复制, 移动, 重命名或删除文件,相反,你需要通过 Subversion 完成这些工作。

假定你能够接受额外的工作流程,你一定要确定不要使用 Subversion 来解决其他工具能够完成的很好的工作。例如,因为 Subversion 会复制所有的数据到参与者,一个常见的误用是将其作为普通的分布式系统。问题是此类数据通常很少修改,在这种情况下,使用 Subversion 有点过了[2]有一些可以复制数据更简单的工具,没有必要过度的跟踪变更,例如 rsyncunison

7.2. Subversion 的历史

早在 2000 年,CollabNet, Inc. (http://www.collab.net)就开始寻找 CVS 替代产品的开发人员。CollabNet 提供了一个名为 CollabNet 企业版(CEE)的协作软件套件。这个软件套件的一个组成部分就是版本控制系统。尽管 CEE 在最初采用了 CVS 作为其版本控制系统,但是 CVS 的局限性从一开始就很明显,CollabNet 知道,迟早要找到一个更好的替代品。遗憾的是,CVS 已经成为开源世界事实上的标准,很大程度上是因为没有更好的替代品,至少是没有可以自由使用的替代品。所以 CollabNet 决定从头编写一个新的版本控制系统,这个系统保留 CVS 的基本思想,但是要修正其中错误和不合理的特性。

2000年2月,他们联系到 Open Source Development with CVS(Coriolis, 1999) 的作者 Karl Fogel,并且询问他是否希望为这个新项目工作。巧合的是,当时 Karl 正在与朋友 Jim Blandy 讨论设计一个新的版本控制系统。1995年时,他们两人曾经开办了一个提供 CVS 支持的公司 Cyclic Software,尽管他们最终卖掉了公司,但还是天天使用 CVS 进行日常工作。使用 CVS 时的挫折促使 Jim 认真的思考如何管理版本化的数据,并且他当时不仅使用了 Subversion 这个名字,并且已经完成了 Subversion 版本库的最初设计。所以当 CollabNet 提出邀请的时候,Karl 马上同意为这个项目工作,同时 Jim 也找到了他的雇主—Red Hat 软件公司—允许他到这个项目工作,并且没有限定最终的期限。CollabNet 雇佣了 Karl 和 Ben Collins Sussman,详细设计工作从五月开始,在 CollabNet 中的 Brian Behlendorf 和 Jason Robbins,以及 Greg Stein(当时是一个独立开发者,活跃在 WebDAV/DeltaV 系统规范制订工作中)恰到好处的激励下,Subversion 很快就吸引了许多活跃的开发者,结果是许多对 CVS 有过失望经历的人很乐于为这个项目做些事情。

最初的设计小组设定了简单的开发目标。他们不想在版本控制方法学中开垦处女地,他们只是希望修正 CVS。他们决定 Subversion 应符合 CVS 的特性,并保留相同的开发模型,但不再重复 CVS 的一些显著缺陷。尽管 Subversion 并不需要成为 CVS 的完全替代品,但它应该与 CVS 保持足够的相似性,以使 CVS 用户可以轻松的转移到 Subversion 上。

经过14个月的编码,2001年8月31日,Subversion 能够自己管理自己了,开发者停止使用 CVS 保存 Subversion 的代码,而使用 Subversion 本身。

虽然 CollabNet 启动了这个项目,并且一直提供了大量的工作支持(它为一些全职的 Subversion 开发者提供薪水),但 Subversion 像其它许多开源项目一样,被松散的, 透明的规则管理着,这样的规则激励着知识界的精英们。CollabNet 的版权许可证完全符合 Debian 的自由软件方针。也就是说,任何人都可以根据自己的意愿自由的下载, 修改和重新发布 Subversion,不需要 CollabNet 或其他人的授权。

7.3. Subversion 的架构

图 1 “Subversion 的架构”给出了 Subversion 设计总体上的俯视图

图 1. Subversion 的架构

Subversion 的架构

图中的一端是保存所有版本数据的 Subversion 版本库,另一端是 Subvesion 的客户程序,管理着所有版本数据的本地影射(称为工作副本),在这两极之间是各种各样的版本库访问(RA)层,某些使用电脑网络通过网络服务器访问版本库,某些则绕过网络服务器直接访问版本库。

7.4. Subversion 的组件

安装好的 Subversion 由几个部分组成,下面将简单的介绍一下这些组件。下文的描述或许过于简略,不易理解,但不用担心—本书后面的章节中会用更多的内容来详细阐述这些组件。

svn

命令行客户端程序

svnversion

此工具用来显示工作副本的状态(用术语来说,就是当前项目的修订版本)。

svnlook

直接查看 Subversion 版本库的工具

svnadmin

建立, 调整和修复 Subversion 版本库的工具

mod_dav_svn

Apache HTTP 服务器的一个插件,使版本库可以通过网络访问

svnserve

一个单独运行的服务器程序,可以作为守护进程或由 SSH 调用。这是另一种使版本库可以通过网络访问的方式。

svndumpfilter

过滤 Subversion 版本库转储数据流的工具

svnsync

一个通过网络增量镜像版本库的程序

7.5. Subversion 有什么新东西?

此书的第一版在 2004 年发布,也就是 Subversion 1.0 发布后不久。经过 4 年,Subversion 发布了 5 个主要的新版本,修正了 bug,增加了主要的新特性。我们一直保持本书在线版本的更新,我们现在很兴奋的是 O'Reilly 将会发布包含 Subversion 1.5 版本的第二版,它是项目的一个主要里程碑。下面是从 Subversion 1.0 以来主要变更的总结。注意这不是完整的列表;详细信息可以访问 Subversion 的网站 http://subversion.tigris.org

Subversion 1.1 (2004年9月)

1.1 版本引入了 FSFS,纯文件的版本库存储选项。虽然 Berkeley DB 后端被广泛的使用,但因为 FSFS 其较低的门槛和较小的管理需要,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月)

1.4 版本引入了完全的新工具 — svnsync — 用来通过网络完成单向的版本库复制。一个重要的部分是工作副本元数据得到修补,不再使用 XML(获得客户端的速度改善),而 Berkeley DB 版本库后端获得了在发生崩溃时自动恢复的能力。

Subversion 1.5 (2008年6月)

1.5 版本花费了比以前版本更长的时间,但是关键特性是巨大的:分支和合并的半自动跟踪。这是为用户带来的巨大便利,也使 Subversion 的能力远远超越 CVS,进入了商业竞争者 Perforce 和 Clearcase 的级别,Subversion 1.5 也引入了一些其它用户关注的特性,例如交互式的文件冲突解决,部分检出,变更列表的客户端管理,外部定义的强大的新语法,以及对 svnserve 服务器的 SASL 认证支持。

Subversion 1.6 (???)

???



[2] 或者像一个朋友说的,用别克拍苍蝇