四、常用源码版本管理工具的工作模式分析
1. CVS/SVN
CVS(Concurrent Versions System,协作版本系统)是一老牌的开源版本管理系统,广泛应用于各中小企业以及网上协作的开源项目,大型企业选择CVS的也不乏少数。CVS是C/S模式,基于TCP/IP协议进行通讯。由于CVS的通讯协议公开,开发者甚至可以自行开发自己的CVS客户端,这也是CVS广泛使用的一个原因。
3 p. z3 O6 b2 }( Z* x
CVS的服务端可安装运行在Unix/Linux系统上,Windows上也有其移植的服务端版本,名为CVSNT。CVS自带一客户端cvs.exe命令行,其余的客户端工具有WinCVS和TortoiseCVS等,这两者是封装了cvs.exe命令行的图形化界面工具。 q7 O# H0 ?# c* J! W
* X$ |* X" [/ u
SVN(SubVersion)是作为CVS的升级产品而推出的新一代源码版本管理工具,它弥补了CVS在网络通讯、权限控制、格式存储、文件目录重命名等各方面的一些缺陷。SVN同样是C/S模式,可采用HTTP协议通讯 ,服务端支持Unix/Windows,SVN也自带一客户端命令行svn.exe,目前比较成熟的图形化界面的客户端有TortoiseSVN等。, A* h- Q5 N) I% n" o
: g7 m/ Z B% k5 @+ {( R {
CVS和SVN由于工作模式类似,这里将它们放在一起介绍。它们的工作模式可以概括为“远程协作”四个字。服务端存储了各个源码文件的版本树信息,但不能直接使用,需要进行协作的开发者使用CVS/SVN客户端工具,在各自的本地维护一份源码版本的“快照”,开发中可以使用CVS/SVN客户端工具的Update/Commit操作来进行与服务端的内容同步与提交。( ]7 P1 M; Y- ^' {2 q0 n2 B+ H
CVS/SVN在协作开发过程中,用户编辑一文件时,可以选择是否锁定的模式。如某用户已经锁定某一文件(类似于Check out,检出),则解锁前,此文件只允许此用户提交,其他用户在其他地方不能提交,这种“独占”的模式和早期的VSS是类似的,能够避免编辑的冲突。但更普遍的情况是不进行锁定,用户可各自对某个文本文件的快照内容进行改动,提交时如果有冲突,则采用基于行的规则进行Merge(拼合)。举例来说,如果用户甲和用户乙都拥有某文件的1.1版本并都修改了其中部分内容,甲抢先提交了改动的版本,服务端的最新版本变为1.2,此时乙如果也进行提交,则会因为服务器端版本较新而出现冲突。此时乙必须重新Update此文件与本地的文件进行Merge。Merge成功的话,乙的本地文件也便包含了甲在1.2版本中所做的改动,此时乙如再提交,则在服务器端生成1.3版本,同时包含了甲和乙的改动。7 A8 w. f& b4 I a1 j6 {
( x* u( g. H8 H, q
Merge时文本文件基于行的拼合规则也比较好理解:CVS/SVN服务端针对文本文件所记录的是每次提交所改动的行内容,譬如“1.2版本在1.1版本的第八行处插入了两行”、“1.4版本在1.3版本的第五行到第七行有改动”等诸如此类的改动信息,这样在拼合时,只需要取出这种改动信息并在某个版本基础上简单合并即可。如果两处不同的改动影响到了同一行,则这种Merge无法由源码管理系统自动处理,需要用户手工编辑合并后的文件以消除冲突后才能继续提交。: C' y, E9 z \$ M% e3 B
5 c. q9 B$ s9 D$ W4 K
需要说明的是,这种基于行规则的Merge不仅仅是CVS/SVN所独有的,几乎所有成熟的源码管理系统都有此功能。像ClearCase在Merge过程中如遇到冲突,还能弹出图形化的界面供用户手工拼合文本,很是方便。# H6 D3 A, @# F" N7 L) I
CVS/SVN由于其工作模式简单、成本低廉,因此在中小企业与开源项目中得到了广泛的应用。著名的开源项目聚集地SourceForge便免费提供CVS与SVN服务,一些开源项目如国内的JFox、CnPack,甚至国外的Linux,都是采用CVS进行源码版本管理的。' H- G: o1 I$ M
* Q7 d. g4 n- M- K
2. ClearCase
ClearCase是被IBM收购的Rational公司出品的功能强大的源码版本管理系统。它的工作模式与CVS/SVN有很大区别,它集成于操作系统的文件系统中,提供和文件系统的无缝结合,扩展了文件名标识符,使其能带有版本号的信息。
使用ClearCase进行工作时,涉及到的一个重要概念就是View。前面说过,包含版本信息的文件/目录树是一立体树,而我们使用它们进行工作时仍然是基于二维文件/目录树的,因此需要一个“快照”机制来将某些版本的文件映射成普通的文件/目录树,这个机制在CVS/SVN中是通过Update操作在本机上维护一份本地文件来做到的,而在ClearCase中则通过View来完成。一个View相当于一个过滤器的环境,只要进入了这个环境,就允许书写特定的规则来控制如何在版本树中选出需要的文件呈现在开发者眼前。在Unix平台上的ClearCase环境中,View的形式是一个Shell,进入此Shell后,ClearCase便会拦截此Shell中文件读写的系统调用,根据View所配置的规则去ClearCase数据库中找到文件相应的版本内容并模拟成文件返回给调用者,从而实现对文件操作透明的版本管理功能。/ V3 A3 l7 ?4 N3 O' c$ E
& ?. a+ E- x6 J# p. T
ClearCase扩展了文件名标识符,允许文件的完整路径名后加版本信息,如/vobs/test/testfile.c@@/main/1这种形式。其中/vobs/test/testfile.c是通常意义下的文件名,在立体的版本树中可定位到文件/目录树的某个具体文件,而@@/main/1指示了此文件的版本号,/main/1表示主分支上的第一个版本。这样通过这种扩展了的文件标识符,就能准确定位到某文件的某版本。在Unix环境的一个View中,如果我们敲这样的命令查看文件:
7 T8 o6 V. j' F; F. g! B$ v6 m
cat /vobs/test/testfile.c@@/main/1