2008-06-20 作者: 李宁 王慧思 来源:赛迪网
http://tech.ccidnet.com/art/309/20041203/185163_1.html
软件的开发和维护过程,离不开版本管理。对于一份文件,我们经常需要按不同的版本进行归档,或者从资料库里找出反映文件修改历史的不同版本。这样一方面可以使各个阶段的代码和文档变得井然有序,另一方面可以在当前版本出现问题的时候,找回先前的版本。当然,人们希望的还不止这些,例如,人们希望规定谁在什么时候可以如何存取某个版本的内容,也希望差异不大的版本按增量的方式存成一个文件,以节省存储空间……毫无疑问,我们需要一种对文件版本进行控制管理的工具,以有效地控制产品的质量,提高项目开发管理水平。
CVS(Concurrent Versions System)就是一个能让很多程序开发者同时进行软件开发的、强大的版本管理控制工具。CVS并不是Internet的产物,而它的出现却是历史的必然。Richard Stallman倡导的开源软件运动大大加速了这一过程。
起因
开源软件的一个重要特点就是可以从世界任何地方获得代码和改进代码,这是传统软件开发所不具备的。这意味着开源软件的开发在全球开发者的协作下成为一个不间断的过程,每个人都可能成为开发队伍的一员,并且每个人都会随时流动。一个地域上分散的志愿者组织显然不能投入很多的时间来训练其成员彼此合作,这就需要一套项目管理办法,确保新成员能较容易地适应工作;同时有一个自动的机制接收外来代码,使每个成员能及时得到最新修改的代码。当然,这不仅仅是开源社区的需要,只是开源社区的人员分散、资源不易管理,更需要一个版本管理工具。这样的一个工具首先应该支持世界范围的协作,保持发布版本的一致性;其次它能够容易地汇集各个特定版本的Bug,并在全球范围同步一致地进行修改;再者它需要使任何一个开发者能够追踪软件的变化;而在开发者为软件增加新功能的同时,不能妨碍一般用户使用一个相对稳定的版本。
CVS很好地解决了这一问题。 除了开发人员可以使用CVS很容易地把代码变化存入代码库之外,它还为不同角色的人员设置了不同的访问权限。例如,不需要修改代码的人员可以以匿名只读方式访问代码库。而需要修改代码的开发人员每个人都能在自己的机器上建立一个开发树,当需要在一个特殊的代码区工作时,首先通过简单的命令,使开发树获得更新,以保持全球范围开发状态的同步一致。这样就可以避免出现这样的问题:花了半天时间修改的Bug,在提交的时候发现别人已经解决了。一旦确认代码中的Bug别人还没解决,开发者可以马上开始工作。当这些问题解决后,CVS会自动产生补丁,并将补丁发送给维护人员进行检查,最后可能将其并入主项目树中去。
发展历程
早在CVS之前,就出现过对变化前后的文件进行比较,并根据异同形成“补丁”(Patch)的工具。例如,Unix上使用的Diff和Lany Wall写的Patch,这两个工具对程序代码的传播和维护起到了重要作用。但是,后来出现的许多要求Diff和Pach都显得无能为力,例如,发现修补出错而需要退回到以前未修改的状态等。这就要求有一个保存项目历史纪录的系统。
当时初步具备这个功能的工具是SCCS(Source Code Control System),是贝尔实验室的Marc Rochkind在1972年写成的。SCCS是一种基本的源文件版本控制工具,适用于正文文件的版本维护。它基于单一文件的版本控制,代码库和要维护的文件通常在同一目录下。SCCS有一个专门的SCCS文件保留源文件的各编码版本,其中记录了足够的信息来恢复一个版本,并记录了谁对文件有修改权、有版本锁的功能。SCCS是AT&T Unix发行版的一部分。
然而,自由软件项目最终选择了Walter F. Tichy的版本控制系统(RCS)来满足他们的需要。RCS在SCCS基础上加以改进,界面也更加友好,是BSD Unix发行版的一部分。它可以追踪文件的改变,在工作组中对文件的共享和访问进行控制,通常用于维护源代码;也能追踪文件的修改历史。RCS包含一套命令,用于设置RCS源码库中的文件属性、检入检出文件、清除文件、比较修订版本,以及合并文件等。由RCS管理的文件可以既可以是纯文本文件,也可以是二进制文件。
然而,RCS仍存在几个重要缺陷,其中最主要的是由于使用单一目录控制与档案锁,无法让多个编程人员同时开发。因为RCS本身不是针对网络环境写的,开发者只能在RCS代码库所在的机器上工作,难以在分布式环境下开发。这些缺点后来在CVS中都得到了改进。1956年Dick Grune写了一段Shell脚本来简化RCS的使用。1986年10月,它的第6个发行版被放到USENET新闻组comp.soures.unix之中。1989年3月,Brian Berlinor用C语言重新设计并编写了CVS的代码。后来,Jett Polk帮助Brian完成了CVS模型设计,增加了一些关键特性。1993年前后,Jim Kingdon最终将CVS设计成基于网络的平台,开发者们能从Internet任何地方获得程序源代码。
特点