分类: LINUX
2010-08-12 12:19:21
|
使用RCS/CVS来管理源代码
1.
RCS的使用
RCS(Revision Control System)即程序改版控制系统,主要功能是用来管理文件的版本,可以节省空间和时间。这样就不需要在每个程序开发到某一个阶段就将数据拷贝到其他的地方备份起来了。
RCS提供了如下几个最重要的指令:
Ø ci指令:将文件放入RCS目录下的控制系统
Ø co指令:从RCS目录下将文件取出
Ø rcs指令:用来对RCS文件进行参数的设置
1.基本操作方式
一般而言,RCS所产生出来的文件会放在RCS目录中。所以第一步必须要在当前的目录下制作一个文件:
[root@wyh linux]# mkdir RCS
接下来只要使用ci指令。就可以把文件备份到RCS改版控制系统中:
[root@wyh linux]# ci test.c
若要将文件取出,可以使用下列指令:
[root@wyh linux]# co test.c
取出来的文件是只读文件,若要取出可以写入的工作文件,可以加上-l参数来锁定它:
[root@wyh linux]# co -l test.c
此外将文件放入RCS控制系统时,可以使用-l参数锁定文件,那么目录下的文件依然存在:
[root@wyh linux]# ci -l test.c
若要比较当前的文件和RCS中最新版本的文件,可以使用下列指令:
[root@wyh linux]# rcsdiff test.c
2.指定版本
若不指定版本编号时,co会从RCS取得最新的版本。如果要以特定的版本号码写入RCS或读出,可以使用-r参数选项。
[root@wyh linux]# ci -l -r3.25 test.c
<--以3.25作为版本编号
[root@wyh linux]# co -l -r1.2 test.c
<--将RCS中1.2版的test.c读出
此外,rcsdiff也可以用来指定任何一个版本和当前程序代码进行比较。
[root@wyh linux]# rcsdiff -r3.25 test.c
<--取出3.25版与test.c进行比较
3.关键词的使用
在RCS中可以将关键词变量放入程序代码中。这些变量经过RCS会变成版本的注解。用户可以将这些关键词说明当作是程序中的批注。
常用的关键词如下:
$Author$:将版本放入RCS的用户名称。
$Data$:记录程序代码放入RCS时的日期和时间。
$Header$:记录文件的标头,包括RCS路径名称、版本号码、日期、作者等。
$ID$:和$Header$相同,但不包括RCS路径名称。
$Locker$:记录锁定本版本的用户名称。
$Log$:记录将RCS锁住的时间,所输入的文本语句。
$RCSfiles$:记录RCS文件名称。
$Rivision$:指定版本号码。
$Source$:RCS文件名称,包括其路径。
$State$:使用-s选项所指定的特殊状态。
使用关键词的步骤如下所示:
(1)在程序代码中加入任一关键词
[root@wyh linux]#vi test.c
(2)将程序代码放入RCS版本控制系统
[root@wyh linux]# ci -l
test.c
(3)将文件再次取出。在取出的过程中,co会将每个关键词展开成其对应的值
[root@wyh linux]# co -l test.c
[root@wyh linux]# cat test.c
2.
CVS的使用
CVS(Concurrent Version System)是个版本控制系统,利用该系统可以记录源代码文件的历史。例如,当软件修改时会产生Bug,并且可能在做这次修改后很长时间不会发现这些问题。使用CVS就可以容易地回顾老的代码版本去发现哪一次的修改导致这些问题。
如果CVS保留每一次的代码版本,会浪费很多的空间。因此CVS使用一种比较聪明的办法保存多个版本在一个文件中。它仅仅保留版本间的不同内容。如果很多人在同一个项目上工作,则CVS使用让不同开发者独立工作的方式解决了这个问题。每一个开发者的工作都在他自己的目录内,并且CVS将在每个开发者的工作完成后进行合并工作。
在Linux下,CVS的使用一般是以命令行方式。通常,CVS有两种使用方式,一是本机方式,一是远程执行方式。CVS的命令格式是:
cvs [cvs的选项] cvs的动作
[选项]
读者可以用cvs
–H command列出命令command的使用方法。
1).开始项目
用CVS管理代码,首先要创建一个“信息仓库”。“信息仓库”简单来说包含一个目录结构。它包括要管理的源代码和用于管理源代码的各种管理文件。
先设置环境变量CVSROOT,指向信息仓库的绝对路径,然后调用CVS的init命令:
#
CVSROOT=/usr/local/cvsroot;export CVSROOT
# cvs init
# ls -l $CVSROOT
2).添加项目的文件、目录到信息仓库
要将需要管理的项目的文件加入到信息仓库,并做上标志。如果从头开始一个新的项目,就需要创建一个单独的目录,并把所有要使用的文件做一个有效的组织。而如果在开始使用源文件之前该目录就已经存在,则只需进入该目录就行了。
然后,就可以输入源文件目录:
# cvs import -m "Create
Source Dir" myproject wu cvstest
这样会生成 $CVSROOT/myproject
目录。
其中-m用来指定注释信息,如果后面在命令行不指定注释信息,则会启动缺省编辑器(vi)要求输入注释信息;myproject是项目名称;wu,
cvstest分别标识了作者和发行标识。
3).命令简介
(1)导出源文件
cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2]
modules
-r 导出指定版本的模块
-D 导出指定日期的模块
-d 导出指定目录而不是模块
-j 合并当前版本和指定版本
使用下面的命令会导出刚才生成的模块,并在当前目录下生成与文件仓库中完全一样的目录结构:
# cvs checkout
myproject
对于目录结构比较复杂的模块可以在
$CVSROOT/CVSROOT/modules中加以指定:
①#
cvs checkout CVSROOT/modules
②在modules文件中加入下面一行:
SOURCE myproject
③然后执行:
# cvs commit –m “Add SOURCE”
以后就可以使用下面的命令在当前路径下生成myrpoject目录
# cvs checkout
SOURCE
在当前路径下生成的这个目录就被称为工作目录,对源文件的所有修改都应该在这个目录下完成,而绝对不允许去改动在文件仓库中$CVSROOT 目录下的文件。
(2)删除、增加、重命名文件和目录
cvs add [-k kflags][-m message]
files...
-k 指定以后该文件的缺省导出目录
-m 对文件的描述
上述命令会加入一个新的文件到文件仓库里,但直到使用了提交命令它才会真正更新文件仓库。
cvs remove [options] files
上述命令会从文件仓库中删除文件,但也要到提交之后才有作用。
(3)提交源文件
cvs commit [-Rl][-m mesg] files
-R 连子目录一起提交
-l 只提交本地目录(不提交子目录)
-m 注释信息
在导出源文件之后,在工作目录中对源文件进行的所有修改都必须在提交之后才能对文件仓库中的源文件起作用,并且新的文件才能够被分配一个新的版本号。
(4)释放工作目录
cvs release –d SOURCE
这个命令会删除工作目录 myproject(建议在提交了修改的模块后执行这一步),比使用
rm –rf cvstest 要好。
4).多用户开发
在多用户的情况下,如果不同用户修改的是同一个文件的不同部分,则使用下面的命令就能进行版本合并(把检出的文件与当前的最新版本合并):
# cvs
update
(1)冲突解决
在有多个用户对同一个文件进行修改时,如果修改了其中的相同部分,而修改后的内容如果有不同的话,出现冲突是不可避免的。如果在CVS 文件仓库中有一个文件 test.c ,它的版本是1.4,用户A 先检出该文件进行修改,而稍后有用户B检出该文件进行修改,并提前提交成 1.5,而在用户A再提交时就会出现冲突(如果文件内容不同的话),这时CVS会提示需要手工解决。
(2)文件版本管理
cvs log [-lR][-r rev][-d date][-w
login][files…]
-l 不处理子目录
-R 对子目录做同样处理
-r 指定版本号
-d 指定时间
-w 指定登录名
使用上面的命令可以参看当前模块或指定文件的所有历史版本信息。
cvs annotate [-lR][-r rev|-D date] files
-l 不处理子目录
-R 对子目录做同样处理
-r 指定版本号
使用上面的命令可以参看指定文件(检出之后)的所有修改信息。
使用下面的命令可以生成相对于一个指定主版本的分支版本:
cvs rtag –b –r rev_root
rev_branch file_name
-b 指定生成一个分支版本
-r 指定该分支的主干节点版本号
rev_root 主干版本号
rev_branch 分支版本号
file_name 指定文件,使用“.”表示当前目录下所有文件
使用上面的命令可以生成一个对应版本号的分支版本,由于CVS 版本号是用数字表示的,而且在同一个模块下不同文件的版本完全可能是不同的,所以使用标识会更方便。
例:
# cvs rtag –b –r 1.2 tlb-1 SOURCE
以后要访问该分支版本,可以使用“-r” 选项
# cvs checkout –r tlb-1 SOURCE
从当前检出的版本切换到一个分支版本:
# cvs update –r tlb-1 SOURCE
使用下面的命令可以看版本信息:
cvs status [–vlR] files
-v 显示所有信息
-l 不显示子目录信息
-R 显示子目录信息
cvs update –j rev module
把当前所做的修改与指定版本的文件进行合并。
如果在不同版本之间模块的文件有增减,则可以:
# cvs update
–A
# cvs updata –jbranch_name
5).在远程机器上使用CVS
通过网络使用CVS 有很多种方式,但在这里只介绍比较简单的一种:通过rsh 执行cvs
命令。
1) 在远程机器的.rhosts中加入对本地机的访问许可:
tom huang
2) 使用下面的命令检出模块
# cvs –d
:ext:huang@wyhlinux:/work/cvsroot checkout SOURCE
其中,ext 指明了连接方式为
rsh,huang指明了本地用户,wyhlinux指明了远地主机,/work/cvsroot
指明了在远地主机上的$CVSROOT路径,可以在本地设置CVS_SERVER环境变量指明这个目录。