使用CVS进行项目开发管理
作者:网络转载 发布时间:[ 2013/2/17 16:40:52 ] 推荐标签:
CVS在每个目录下面都建立了一个名叫CVS的目录,此外,目录的结构是一样的,事实上,CVS目录中存放的是一些关于目录结构在仓库中的信息,Entries中包含了这些目录中的子目录,Respository包含此目录在仓库中的相对位置,ROOT包含导出的模块主目录的路径。
cvs import命令只是在第一次把项目导入CVS仓库时才使用,以后如果再需要加入目录或者加入文件,则使用cvs add 命令加入,然后使用cvs commit提交之后,文件或者目录才会真正加入到CVS仓库中。我们可以把刚才编辑的hello.c文件拷贝到testprj/src/main/中,然后使用:
[kerberos@power zhyf]$ cvs add testprj/src/main/hello.c
cvs add: scheduling file `testprj/src/main/hello.c' for addition
cvs add: use 'cvs commit' to add this file permanently
使用cvs commit提交修改
[kerberos@power zhyf]$ cvs commit
cvs commit: Examining testprj
cvs commit: Examining testprj/admin
cvs commit: Examining testprj/doc
cvs commit: Examining testprj/include
cvs commit: Examining testprj/libs
cvs commit: Examining testprj/src
cvs commit: Examining testprj/src/include
cvs commit: Examining testprj/src/main
RCS file: /home/zhyf/cvsroot/testprj/src/main/hello.c,v
done
Checking in testprj/src/main/hello.c;
/home/zhyf/cvsroot/testprj/src/main/hello.c,v <-- hello.c
initial revision: 1.1
使用RCS管理单个文件
done
testprj/src/main/hello.c
由于CVS使用RCS管理单个文件,所以,前面我们讲的关于RCS的知识也可以用到这里,不同的是命令之前要限定是cvs,比如cvs ci, cvs co, cvs diff, 或者在导出时使用 -r 选项指定导出的文件的版本。在源代码文件中,同样也可以使用RCS的关键字。
对于非ASCII文件,如二进制可执行文件,位图等文件,我们不能直接使用cvs add加入到CVS仓库中,因为CVS只是基于ASCII代码比较文件的改变,所以,对于二进制文件,如果单纯使用cvs add 命令会破坏文件的完整,所在加入二进制文件时,要指定-kb参数。如果对已有文件进行了修改,使用cvs ci, cvs commit 来提交修改。
另外一种情况是自己导出别人修改的文件,而不想覆盖自己所作的修改,可以使用cvs update命令,这个命令会自动比较CVS仓库中文件和当前自己文件的后修改时间来导出新的文件。
在cvs update 和cvs ci 时,你对此的文件修改与他人发生冲突,CVS则提示你。CVS会在文件中使用“>>>>>>” 或者“<<<<<<<”标记标出冲突的地方,你可以与他人协商手动修改这一段代码。
如果你想删除仓库中的一个文件,要先删除本地导出的文件,然后使用cvs remove 文件名, cvs commit来删除。事实上,CVS是不会真正删除这些文件的,如果你还想得到这些文件,只需要,使用cvs co -r 指定删除前的版本导出可以了。
有时候为了导出CVS仓库中的深层目录或者文件不得不输入很长的路径,这一点很讨厌,你可以导出CVS仓库中CVSROOT目录下,修改modules文件,定义这个目录或者文件为一个模块,提交修改后可以直接使用cvs co 模块名 可以导出了。
CVS的版本控制功能主要体现在tag上。标记的作用如同是同时记录了做标记时所有文件的版本,需要的时候可以一次导出这些版本不一的文件,这常常是在项目的开发达到了一定的目标时使用的。
cvs tag 命令的参数只有一个:标记名。例如:
cvs tag RELEASE_1.0_BETA
以后,如果需要这个版本,只需要使用cvs co -r RELEASE_1.0_BETA可以导出这个版本了。或者使用cvs diff -r 来生成patch文件和使用cvs log -r 来查看这个版本的日志。
标记的另外一个非常重要的作用是生成分支和合并分支。
通常,我们的项目的开发到某一定的程度时,需要探索某一条开发途径是否有效,这个时候,我们需要做一个试验,但是这个试验的分支的开发不能影响项目的主开发分支,这样,我们可以生成一个分支开发,主开发分支也可以继续进行,两者并不冲突,将来如果证明分支开发有效,还可以把分支合并到主开发分支中。建立一个CVS分支:
cvs tag -b 分支标记名
建立分支后,并不影响当前我们从CVS仓库中的文件,需要从CVS仓库中重新导出分支BRANCH_VER:
cvs co -r 分支标记名 模块名
这样,我们可以进行分支开发,主分支的开发也可以照常进行,如果此分支开发成功,我们可以把它与主分支合并:
cvs update -j 分支标记名
cvs commit
可以把开发分支合并到主分支中去了。
以上是本地CVS仓库的操作,如果使用网络CVS仓库,只需要使用CVS_RSH环境变量指定通信shell,另外设置CVS仓库为网络仓库可以了。网络上的CVS仓库的服务器有两种:ext和dserver。对于后者在进行CVS操作时,需要先login验证用户。后者使用rlogin验证,不需要显式登陆。如:
ext CVS 服务器使用
export CVSROOT=:ext:kerberos@power:/home/repository
或者cvs -d :ext:kerberos@power:/home/repository
cvs co platoon
derser CVS 服务器使用
export CVSROOT=:pserver:anonymous@anoncvs.kde.org:/home/kde
cvs login
cvs co kdebase
其他一些常用的cvs 命令选项
-d 指定CVS仓库的路径
-zn 使用gzip 压缩后传输,到本地后自动解压。n为压缩级别通常式 1~4,通常使用于服务器的传输速度较慢的情况下。
-x 用于服务器的通信使用加密算法,只有在使用kerberos验证体系下有效
CVS 的GUI工具
几个常用的GUI工具:
LinCVS(图1),是Xwindow 的CVS客户端工具,比较流行的一个,功能也很强大.