CnPack Open Source Projects - 主流源码版本管理工具的特色浅析
     Home Page    News    Downloads    Nightly Build    Documents    Foundation    Forum    Credits    简体中文
 Latest Releases

 
CnWizards 1.5.0.1209
[2024-09-17]

 
CnVCL 20240917
[2024-09-17]

 
CVSTracNT V2.0.1 Build 20080601
[2008-06-02]
  Nightly Build RSS
  Timeline RSS RSS
 Project Links
CnPack at GitHub
Use GitHub
CnPack Mail
 Visitors
Today Visitors: 672
Today Pages: 4014
Total Visitors: 5269549
Total Pages: 21207546
Since: 2003-09-01
主流源码版本管理工具的特色浅析

CnPack Open Source Projects 2008-04-08 15:21:58

主流源码版本管理工具的特色浅析

Passion(LiuXiao)

此文曾发表于2008年3月的《程序员》杂志,转载请注明出处且保持完整。

一、前言

源码版本管理工具在软件开发流程中扮演着版本历史记录、代码协同管理以及支持发布工作等角色,其重要性不言而喻。目前比较流行的源码版本管理工具有开源的CVS、SVN、商业的ClearCase、VSS(Visual SourceSafe)等。其中CVS、SVN、ClearCase应用较广。本文将对这几种主流源码版本管理工具的工作模式进行一些介绍与分析对比,以便于读者选择适用于个人或企业的合适产品。

二、源码版本管理工具功能概述

在极其小型的单人软件开发模式中,源码版本管理工具的作用或许还不明显,但随着软件开发规模的扩大,源码的数量也逐渐增加,开发过程中免不了出现由于Bug或其他需求而要求代码回滚的情形,这样倘若没有代码备份的历史,那简直是一场灾难;另外开发团队人员规模扩大时,基于分工也难免出现不同的人员修改同一份代码的情形,因此使用源码版本管理工具来进行协作便势在必行。

源码版本管理工具首先是一个源码历史记录系统,开发人员每一次提交给该系统的源码文件,都会作为该文件的某一个版本而被存储起来,不会出现新版本内容覆盖旧版本内容的现象,旧版本代码随时可取出备用。这样,原先源码中形式上为二维的文件/目录树结构,由于加上了版本信息的扩展,将呈现出一棵立体版本树的构造,文件/目录树的每个枝叶都是一棵版本树的树根。

其次,源码版本管理工具能接受多个用户提交的不同版本的源码,并允许各个用户以一定的规则进行合作,这便是它的第二个典型功能:协同开发。当然,不同的系统中协同开发的规则也不一样,比如早期的Visual SourceSafe在同一时间只允许一个用户锁定并修改同一文件,而CVS、SVN、ClearCase允许同一时间有多个用户修改同一文件并事后进行拼合,这些都是在选择源码版本管理工具时需要注意的。

另外,源码版本管理系统还应该有其他一些典型功能,如分支管理,用户权限管理等,这些功能基本上都比较成熟了,本文中不再赘述。

三、源码版本管理工具对开发流程的其他支持

网上有个比喻说“版本管理之于程序员,就好比安全网之于高空秋千表演者。知道安全网就在那里,万一自己摔落它能够提供保护,高空秋千表演者才能放心大胆地在空中飞跃。”这个比喻生动说明了版本历史的重要性,但再进一步想想,对于单个的高空表演者,身下放一个安全网自然能保证他的安全,但如果有成百上千的表演者的话,难道为了安全,每人都必须挨个配一张安全网?同样,对于一个大型软件项目中的数量众多的源码文件来说,如果出现因为出问题而需要回退到上一版本,那么为了回退而逐个检查本次改动了的文件及其版本号,这本身就是一个相当庞大的工程,就像费事地挨个为高空表演者去检查各自的安全网一样麻烦。

对于这类问题,源码版本管理工具也提供了“大安全网”的机制:标记或标签,其对应英文术语是Tag和Label。这种机制能替一批文件甚至项目中的所有文件的某个版本打上同一个字符串的标记,相当于给众多高空表演者身下拉上了一张大安全网,这样回退的时候,只需要给出这个字符串标记,便能在源码管理工具的支持下,在众多的源码文件中同时定位到各自的版本,就像在大安全网上寻找掉落的高空表演者一样方便。

当然,这种标记标签的机制并非只为源码回退而设计,实际上它们在软件的构建发布等方面起着更重要的作用。设想这样一个场面:众多程序员各自最终将各自开发完成的文件提交至规模庞大的版本树,各个文件的最终目标可能处于不同分支上,如果不采取标记/标签的机制,那么从庞大的版本树上检索出软件最终需要的所有源文件的各个指定版本将异常困难,这种情况下程序员提交后便要求给所需要的文件的版本打上特定的标记/标签,然后提交这个标签的名称,最后构建发布时发布人员只要根据程序员们提交的标签就能取出所需要的源文件,这样显然方便得多。如果日常开发过程中要实施增量构建等类似的流程,构建发布人员也只需维护一张标签列表,由各个程序员定期提交新的标签供构建即可。

四、常用源码版本管理工具的工作模式分析

1.     CVS/SVN

CVS(Concurrent Versions System,协作版本系统)是一老牌的开源版本管理系统,广泛应用于各中小企业以及网上协作的开源项目,大型企业选择CVS的也不乏少数。CVS是C/S模式,基于TCP/IP协议进行通讯。由于CVS的通讯协议公开,开发者甚至可以自行开发自己的CVS客户端,这也是CVS广泛使用的一个原因。

CVS的服务端可安装运行在Unix/Linux系统上,Windows上也有其移植的服务端版本,名为CVSNT。CVS自带一客户端cvs.exe命令行,其余的客户端工具有WinCVS和TortoiseCVS等,这两者是封装了cvs.exe命令行的图形化界面工具。

SVN(SubVersion)是作为CVS的升级产品而推出的新一代源码版本管理工具,它弥补了CVS在网络通讯、权限控制、格式存储、文件目录重命名等各方面的一些缺陷。SVN同样是C/S模式,可采用HTTP协议通讯 ,服务端支持Unix/Windows,SVN也自带一客户端命令行svn.exe,目前比较成熟的图形化界面的客户端有TortoiseSVN等。

CVS和SVN由于工作模式类似,这里将它们放在一起介绍。它们的工作模式可以概括为“远程协作”四个字。服务端存储了各个源码文件的版本树信息,但不能直接使用,需要进行协作的开发者使用CVS/SVN客户端工具,在各自的本地维护一份源码版本的“快照”,开发中可以使用CVS/SVN客户端工具的Update/Commit操作来进行与服务端的内容同步与提交。

CVS/SVN在协作开发过程中,用户编辑一文件时,可以选择是否锁定的模式。如某用户已经锁定某一文件(类似于Check out,检出),则解锁前,此文件只允许此用户提交,其他用户在其他地方不能提交,这种“独占”的模式和早期的VSS是类似的,能够避免编辑的冲突。但更普遍的情况是不进行锁定,用户可各自对某个文本文件的快照内容进行改动,提交时如果有冲突,则采用基于行的规则进行Merge(拼合)。举例来说,如果用户甲和用户乙都拥有某文件的1.1版本并都修改了其中部分内容,甲抢先提交了改动的版本,服务端的最新版本变为1.2,此时乙如果也进行提交,则会因为服务器端版本较新而出现冲突。此时乙必须重新Update此文件与本地的文件进行Merge。Merge成功的话,乙的本地文件也便包含了甲在1.2版本中所做的改动,此时乙如再提交,则在服务器端生成1.3版本,同时包含了甲和乙的改动。

Merge时文本文件基于行的拼合规则也比较好理解:CVS/SVN服务端针对文本文件所记录的是每次提交所改动的行内容,譬如“1.2版本在1.1版本的第八行处插入了两行”、“1.4版本在1.3版本的第五行到第七行有改动”等诸如此类的改动信息,这样在拼合时,只需要取出这种改动信息并在某个版本基础上简单合并即可。如果两处不同的改动影响到了同一行,则这种Merge无法由源码管理系统自动处理,需要用户手工编辑合并后的文件以消除冲突后才能继续提交。

需要说明的是,这种基于行规则的Merge不仅仅是CVS/SVN所独有的,几乎所有成熟的源码管理系统都有此功能。像ClearCase在Merge过程中如遇到冲突,还能弹出图形化的界面供用户手工拼合文本,很是方便。

CVS/SVN由于其工作模式简单、成本低廉,因此在中小企业与开源项目中得到了广泛的应用。著名的开源项目聚集地SourceForge便免费提供CVS与SVN服务,一些开源项目如国内的JFox、CnPack,甚至国外的Linux,都是采用CVS进行源码版本管理的。

2.     ClearCase

ClearCase是被IBM收购的Rational公司出品的功能强大的源码版本管理系统。它的工作模式与CVS/SVN有很大区别,它集成于操作系统的文件系统中,提供和文件系统的无缝结合,扩展了文件名标识符,使其能带有版本号的信息。

使用ClearCase进行工作时,涉及到的一个重要概念就是View。前面说过,包含版本信息的文件/目录树是一立体树,而我们使用它们进行工作时仍然是基于二维文件/目录树的,因此需要一个“快照”机制来将某些版本的文件映射成普通的文件/目录树,这个机制在CVS/SVN中是通过Update操作在本机上维护一份本地文件来做到的,而在ClearCase中则通过View来完成。一个View相当于一个过滤器的环境,只要进入了这个环境,就允许书写特定的规则来控制如何在版本树中选出需要的文件呈现在开发者眼前。在Unix平台上的ClearCase环境中,View的形式是一个Shell,进入此Shell后,ClearCase便会拦截此Shell中文件读写的系统调用,根据View所配置的规则去ClearCase数据库中找到文件相应的版本内容并模拟成文件返回给调用者,从而实现对文件操作透明的版本管理功能。

ClearCase扩展了文件名标识符,允许文件的完整路径名后加版本信息,如/vobs/test/testfile.c@@/main/1这种形式。其中/vobs/test/testfile.c是通常意义下的文件名,在立体的版本树中可定位到文件/目录树的某个具体文件,而@@/main/1指示了此文件的版本号,/main/1表示主分支上的第一个版本。这样通过这种扩展了的文件标识符,就能准确定位到某文件的某版本。在Unix环境的一个View中,如果我们敲这样的命令查看文件:

cat /vobs/test/testfile.c@@/main/1

那么将会直接看到/vobs/test/testfile.c这个文件在主分支上的第一个版本的内容。当然,如果文件名没加后面的@@/main/1,则取当前View的规则所指定的版本的内容。

View的规则配置文件在ClearCase中被称为Config Specification,一条规则描述了“对于哪些目录/文件选择它的哪些版本使其可见”,一个View的配置文件中可以包含多条规则。当ClearCase遇到不带版本修饰符的文件名时,便从View的配置文件中从上到下逐条匹配规则,如果某条规则正好适用于此文件,则按此规则取出文件的版本内容,这部分对用户来说是透明的。

ClearCase在提交文件的新版本之前需要进行Check out(检出并锁定)操作,这点和CVS/SVN有所不同。一个文件不允许多个用户同时直接Check out,但允许多个用户Check out到不同分支并允许事后进行Merge,因此也可达到多人协作的效果。另外由于ClearCase和文件系统集成,因此可不需专用的客户端,使用命令行即可完成日常操作,但ClearCase同时也提供了部分图形化界面工具来方便用户进行操作管理,包括查看某文件的版本树、使用分支、比较、合并、标签等扩展内容,功能十分强大。

ClearCase正因为其功能强大的特点,即使价格不菲,也仍旧成为大型软件公司首选的源码版本管理工具,只是它的使用难度稍大,上手不易,其培训的附加成本和时间往往是购买ClearCase的公司所需要考虑的。

3.     VSS

VSS(Visual SourceSafe)是微软出品的源码版本管理工具,和微软自身的开发工具Visual Studio结合比较方便。Visual SourceSafe是基于局域网中文件共享的C/S工作模式,因此适合于地理上集中的开发团队,不适合于远程协作。

VSS的服务器端在支持Windows文件共享的局域网中架设好后,各开发者便可通过VSS客户端对源码进行操作。VSS客户端对文件的操作模式也有Check out(检出并锁定)一说,某用户Check out一文件后,服务器端此文件便不允许其他用户再Check out,从而禁止了多人同时编辑一文件可能造成的冲突。也就是说,这种工作模式不支持并行。

微软后来推出了VSS的升级版Team Foundation,它在非文件共享模式的远程访问、并行开发的锁定控制等方面较VSS都有了明显改进,允许HTTP协议访问,允许多人并行协作,支持工作项目跟踪和报告。用微软自己的话来说,Team Foundation是一个完整的软件配置管理解决方案,能给多种工作模式的团队提供尽可能多的支持。

五、源码版本管理工具与需求变更/错误跟踪管理工具的集成

出于质量控制的目的,在比较大规模的软件开发流程中,源码版本管理工具往往和需求变更/错误跟踪管理工具配合使用。形象点儿说,源码版本管理工具的目的是让每一行代码的改动都留下修改的痕迹,需求变更/错误跟踪管理工具则是为每一行代码的改动都记下修改的理由。CVS/SVN有CVSTrac/SVNTrac、BugZilla等配合使用,ClearCase则有ClearDDTS/ClearQuest。

这两类工具配合工作的关键,是将源码的提交和描述修改的文档性质的内容关联起来。其配合工作的大致流程如下:当出现某个Bug或者某个新需求而需要修改代码时,先在需求变更/错误跟踪管理工具中创建一条记录,描述此次改动的理由。CVS/SVN中可以将某次提交的动作关联到这条记录上供查看,ClearCase则更加严格地将View的创建、分支的创建和提交都关联到这条记录上,不允许在无记录的情况下单独对ClearCase中的代码进行改动。从这点来说,ClearCase与ClearQuest/ClearDDTS的配合更为严格,每一行代码的改动都能找到ClearQuest/ClearDDTS中的对应修改记录,有利于大型软件开发过程中的质量控制。而CVSTrac只是可以关联修改记录但并非强制,这也符合中小规模项目的特点:作风自由、进度紧凑,质量控制主要依赖于开发者的自觉性。

六、结语

本文简要介绍了CVS/SVN与ClearCase这几种主流源码版本管理工具的特点与工作模式,对即将在开发中选择源码版本管理工具的个人或企业有一定参考价值。源码版本管理在整个软件配置管理流程中占相当重要的一部分,一般在软件开发生命周期的前期便要求确定下来,以利于编码维护过程中的开发人员协作处理。此外,软件的文档部分在很多场合也可由源码版本管理工具统一管理,并可以基于其配套的需求变更/错误跟踪管理工具对文档提供方便的浏览、编辑界面,很多企业事实上也正是这么做的。

目前,除了主流的CVS/SVN与ClearCase外,还有另外几种源码版本管理工具,如GIT、Perforce、TeamSource/StarTeam等,也各有特色,部分专用性比较强,适用于有特殊需求的场合。

本文没有具体介绍CVS/SVN与ClearCase等工具的实际安装配置的详细内容,如果读者有进一步的兴趣,也可自行参考相关文章。



Page hits: 16720 times
From: CnPack Open Source Projects

Previous | Up

Links:


(C)Copyright 2001-2014 CnPack Develop Team  Site author: JingYu Zhou