【IT168 技术文章】
Subversion是什么?
Subversion 是一个自由/开源版本控制系统,它管理文件和目录可以超越时间。一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种“时间机器”。
Subversion 可以通过网络访问它的版本库,从而使用户可以在不同的电脑上使用。一定程度上可以说,允许用户在各自的地方修改同一份数据是促进协作。由于所有的工作都有历史版本,你不必担心由于失去某个通道而影响质量,如果存在不正确的改变,只要取消改变。
Subversion的历史
早在2000 年,CollabNet, Inc. (http://www.collab.net) 开始寻找CVS 替代产品的开发人员,CollabNet 提供了一个协作软件套件CEE (CollabNet Enterprise Edition),它的一个组件是版本控制系统。尽管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 时的挫折最终促使他们认真地去考虑如何管理标记版本的数据,而且他们当时不仅仅提出了“Subversion”这个名字,并且做出了Subversion 版本库的基础设计。所以当CollabNet 提出邀请的时候,Karl 马上同意为这个项目工作,同时Jim 也得到了他的雇主,RedHat 软件赞助他到这个项目并提供了一个宽松的时间。CollabNet 雇佣了Karl 和Ben Collins Sussman,详细的设计从三月开始,在Behlendorf 、CollabNet、Jason Robbins 和 Greg Stein(当时是一个独立开发者,活跃在WebDAV/DeltaV 系统规范阶段)的恰当激励的帮助下,Subversion 很快吸引了许多活跃的开发者,结果是许多有CVS 经验的人们很乐于有机会为这个项目做些事情。
最初的设计小组固定在简单的目标上,他们不想在版本控制方法学中开垦处女地,他们只是希望修正CVS,他们决定Subversion 匹配CVS 的特性,保留相同的开发模型,但不复制CVS 明显的缺陷。尽管它不需要成为CVS 的继任者,它也应该与CVS 保持足够的相似性,使得CVS 用户可以轻松的做出转换。经过14 个月的编码,2001 年8 月31 日,Subversion 自己能够“成为服务”了,开发者停止使用CVS 保存Subversion 的代码,而使用Subversion 本身。
当CollabNet 开始这个项目的时候,曾经资助了大量的工作(它为全职的Subversion 开发者提供薪水),Subversion 像许多开源项目一样,被一些激励知识界精英的宽松透明的规则支配着。CollabNet 的版权许可证完全符合Debian 的自由软件方针,也就是说,任何人可以自由的下载,修改和重新发布,不需要经过CollabNet 或其他人的允许。
功能性对比
一、Subversion包含绝大部分CVS功能
Subversion 作为CVS 的重写版和改进版,其目标就是作为一个更好的版本控制软件,取代目前流行的CVS。Subversion 的主要开发人员都是业界知名的CVS 专家。Subversion支持绝大部分的CVS 功能/命令;Subversion 的命令风格和界面也与CVS 非常接近。当然,不同的地方正是对CVS 的改进。
二、全局性的版本编号
一个新的版本,并得到一个自增量的版本号N+1,该版本号并不针对某个特定的文件,而是全局性的、针对整个版本库的。因此,我们可以将Subversion 的版本库看作是一个文件系统或文件目录树的数组。
从技术的角度来说,在Subversion 中,“文件foo.c 的第5 版本”这个说法是错误的;正确的说法应该是:”文件foo.c 在版本库被修改了5 次,即执行5 次commit 后是什么样子?”。显然,在Subversion 中,版本库被修改5 次后foo.c 的内容,和被修改了6 次后foo.c 的内容很可能完全一样,因为版本库的第6 次修改很可能只修改了版本库的其他部分,而并没有对foo.c 的进行修改。相反,在CVS 中,文件foo.c 的第1.1 版本和第1.2 版本总是不同的。
Subversion 的全局性版本编号为Subversion 带来了诸多的优势:如对目录或文件执行拷贝,无论涉及多少文件,Subversion 不需要对单个文件依次执行拷贝命令,仅仅需要建立一个指向相应的全局版本号的一个指针即可。