|
4#
楼主 |
发表于 28.11.2002 13:00:36
|
只看该作者
<br><br> <br><br> CVS,顾名思义,是个可以用在小组协作环境下的源码版本管理系统。同类的软件有AT&T的SCCS(Source Code Control System),还有PVCS等。在OpenSource项目里CVS用得最为广泛, Linux kernel不使用CVS来维护,下面我们将会参考FreeBSD的源码管理来做示例。CVS是个相当复杂的系统,FreeBSD甚至设有专门的“CVS管理员”(CVS “Maester”)来全面负责项目的CVS repository维护。<br><br> 下面介绍与CVS相关的若干概念和术语:<br><br> Repository: “源码仓库”,CVS存放的项目源码历史档案<br><br> CVSROOT: 该环境变量指明CVS Repository存放的目录<br><br> Module: 模块。就是CVSROOT下的顶级目录名<br><br> Vendor Branch: 分支。在一套Repository里可以存放多个代码分支的历史<br><br> Release Tag: 发行标记。对于每一个版本,可以用符号来做标记<br><br> 下面是一个CVS repository的版本衍生图,大致描绘了FreeBSD的版本发行情况。图中的RELENG_3和RELENG_4表示“Release Engine”,也就是Vendor Branch,每个Branch分头发展,等某个Branch的开发到了一定的质量水准,就做个Release Tag。比如最近的4.0-RELEASE的Release Tag是REL_4_0。<br><br> 这些不同的Branch都存放在同一个Repository Tree里。<br><br> <br><br> <br><br> <br><br> CVS是个很复杂的系统,可以参考下面两个URL获得进一步的信息:<br><br><a href='http://www.cyclic.com' target='_blank'>http://www.cyclic.com</a><br><br><a href='http://www.loria.fr/~molli/cvs-index.html' target='_blank'>http://www.loria.fr/~molli/cvs-index.html</a><br><br>(在cvs软件包里含有详细的文档,应当查阅info版本。几个ps文件都太老了)<br><br>下面介绍CVS的基本用法。<br><br>① Import 导入/创建CVS Repository Tree<br><br> 首先建一个目录作为你的CVSROOT,然后用cvs init命令对其初始化(建立一系列log,config文件)。然后到工作目录下使用cvs import命令:<br><br> [hahalee@builder]$ mkdir /home/hahalee/CVS<br><br> [hahalee@builder]$ export CVSROOT=/home/hahalee/CVS<br><br> [hahalee@builder]$ cvs init<br><br> [hahalee@builder]$ cvs import _b 0.5.0 hftpd RELENG_0 REL_0<br><br> N hftpd/tar.h<br><br> N hftpd/auth.h<br><br> [blah...blah...blah...]<br><br> N hftpd/docs/rfcs/rfc0959.txt<br><br> N hftpd/docs/rfcs/rfc2428.txt<br><br> No conflicts created by this import <br><br> 上述操作在$CVSROOT下生成hftpd目录,可以看到里面都是后缀为“,v”的文件,这就是import进来的Repository。RELENG_0是vendor-tag,REL_0是release-tag。vendor-tag就是vendor branch tag,可以理解为”code name”。<br><br>② Checkout 创建私有工作目录/Export<br><br> 换一个空目录,运行 cvs checkout modules_name 即可:<br><br> [hahalee@builder]$ cvs checkout hftpd# hftpd是我们的module name<br><br> cvs checkout: Updating hftpd<br><br> U hftpd/AUTHORS<br><br> U hftpd/COPYING<br><br> [blah blah blah] # 省略许多<br><br> [hahalee@builder t]$ ls -l<br><br> 总共 0<br><br> drwxrwxr-x 5 hahalee hahalee 1253 Apr 7 20:08 hftpd<br><br> [hahalee@builder t]$ find ./ -type d<br><br> 从最后一条命令的输出可看到,checkout的工作目录里多了CVS目录。里面记载了CVS相关的信息,可以方便后续的cvs操作。如果纯粹是为了拷贝出最新的source tree,可以用export,此时不会建立CVS目录。<br><br>③ Update 更新<br><br> 当你完成某一部分代码的时候,先不忙提交,可以把别人可能做了的其他修改update过来然后统一编译调试无误后再提交,这是team work的准则。在checkout出来的工作目录下(不管什么子目录),直接cvsup update 就可以了,当然你要先把CVSROOT环境变量设置好。<br><br>④ Commit 提交<br><br> 很简单,cvs commit。但你必须要在checkout出来的工作目录里提交才行:<br><br> [hahalee@builder]$ cvs commit<br><br> cvs commit: Examining .<br><br> cvs commit: Examining docs<br><br> cvs commit: Examining docs/man<br><br> cvs commit: Examining docs/rfcs<br><br> cvs commit: Examining tools<br><br> Checking in AUTHORS;<br><br> /home/hahalee/CVS/hftpd/AUTHORS,v <-- AUTHORS<br><br> new revision: 0.6; previous revision: 0.5<br><br> done<br><br> 关于并发提交冲突:任何用户可以随意checkout他们自己的工作拷贝,commit也是不受限制的。这样,当用户a和b分别checkout了1.2版的c.c,然后各自对c.c做了修改,a提交了他的修改,然后,当b提交的时候,冲突就产生了。<br><br> 这时候,cvs会做以下动作:<br><br>告诉用户b,对c.c的提交发生冲突 <br>对用户b当前的c.c做备份文件.#c.c.1.2 <br>试图合并a和b的修改,生成新的c.c<br>然后,用户b应当修改c.c,去掉/合并冲突的行,并以版本1.4提交。<br><br>⑤ Diff<br><br> 可以用类似rcsdiff的方法用cvs生成patch,命令行语法也类似<br><br> [hahalee@builder]$ cvs diff -u -r0.5 AUTHORS<br><br> Index: AUTHORS<br><br> ===================================================================<br><br> RCS file: /home/hahalee/CVS/hftpd/AUTHORS,v<br><br> retrieving revision 0.5<br><br> retrieving revision 0.6<br><br> diff -u -r0.5 -r0.6<br><br> --- AUTHORS 2000/04/07 10:46:02 0.5<br><br> +++ AUTHORS 2000/04/07 14:05:57 0.6<br><br> @@ -1,3 +1,4 @@<br><br> +ah! let me in!<br><br> So then, who can't spell<br><br> Develloppopotamus?<br><br> Quite a lot of us.<br><br> 还有一个rdiff,用来生成两个不同的release 之间的patch。<br><br>⑥ 其他操作<br><br> cvs 的其他操作还包括有:<br><br> admin 管理功能<br><br> tag 对某一版本做符号标记<br><br> release 取消checkout,删除工作目录(release在这里是“释放”的意思)<br><br> add,remove 往repository里添加/删除文件<br><br> history 查看repository操作历史记录<br><br>⑦ CVS 的多平台特性以及C/S扩展<br><br> cvs是多平台的,开发可以在多种平台比如,可以把linux上的CVS Repository通过samba export出来在Windows平台上做开发。现在很多软件包里包含有*NIX/Windows/MacOS等多平台支持代码,cvs的跨平台特性可提供最好的多平台开发支持。<br><br> 不过,cvs的操作是直接基于文件系统的,在需要大量远程协作的场合问题很多,远程的NFS mount效率太差,也会有安全问题。新版本的cvs自身内建了Client/Server支持,也可以利用Unix上传统的远程交互手段来通讯。<br><br> 1,通过rsh(也可用ssh替换)<br><br> 2,使用cvs自带的C/S用户认证:pserver(缺省端口2401)<br><br> 3,使用kerberos的gserver、kserver<br><br> <br><br> <br> |
|