GZICP.com   
 
    返回首页
    联系我们
 
 
     

CVS使用简介

www.gzicp.com   2004年4月21日 15:53:36
 
CVS 使用简介  
============  
CVS是RCS的前端工具,它是用于多用户并行开发的版本控制工具,它的最大特点 
是使用了“copy-modify-merge”机制而不是“lock-modify-unlock”。通过使用 
CVS生成一个存储文件的仓库(repository),存储在仓库中的每个目录叫做模块 
(module),在修改时将相应的模块检出到工作目录中(working directory)生 
成对应的目录,所有的修改都在工作目录中完成,修改完成后再提交到仓库中生 
成新的版本号,并加以保存。  

1. CVS初始化  
-------------  
(1) 创建CVSROOT根目录  
编辑有关的环境变量,加入CVSROOT的定义(比如在 /etc/bashrc 文件中加入下 
面两行):  
CVSROOT=/usr/local/cvsroot  
export CVSROOT  

然后在相应位置开始创建CVSROOT  
$cd /usr/local/  
$mkdir cvsroot  
$cvs –d /usr/local/cvsroot init  

这时就会产生/usr/local/cvsroot/CVSROOT 目录,这下面放着有关CVS的配置文 
件。同时/usr/local/cvsroot/也作为文件仓库存放所有的文件。  
(2) 创建开发项目  
如果从头开始一个新的项目,就需要创建一个单独的目录,并把所有要使用的文 
件做一个有效的组织。而如果在开始使用源文件的目录之前就有了,则只需进入 
该目录就行了。  
$cd /work/tang  
$ls cvstest  
. .. c/  
$cd cvstest  
然后,就可以输入源文件目录:  
$cvs import –m “Create Source Dir” cvstest/c tang cvstest  

这样会生成 $CVSROOT/cvstest/c 目录。 其中 -m 用来指定注释信息,如果后面 
在命令行不指定注释信息,则会启动缺省编辑器(vi)要求输入注释信息。 tan 
g, cvstest分别标识了厂商和发行标识。  

注意,使用import命令会把当前目录下的所有文件和目录(包括子目录)引入到 
文件仓库中指定模块(目录)下。  

2. 命令简介  
-------------  
(1) 检出源文件  
cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules  

-r 检出指定版本的模块  
-D 检出指定日期的模块  
-d 检出指定目录而不是模块  
-j 合并当前版本和指定版本  

使用下面的命令会检出刚才生成的模块,并在当前目录下生成与文件仓库中完全 
一样的目录结构:  
$cvs checkout cvstest/c  

对于目录结构比较复杂的模块可以在 $CVSROOT/CVSROOT/modules中加以指定:  


1) $cvs checkout CVSROOT/modules  
2) 在modules文件中加入下面一行:  
SOURCE cvstest/c  
3) 然后执行:  
$cvs commit –m “Add SOURCE”  

以后就可以使用下面的命令在当前路径下生成 cvstest/c 目录  
$cvs checkout SOURCE  

在当前路径下生成的这个目录就被称为工作目录,对源文件的所有修改都应该在 
这个目录下完成,而绝对不允许去改动在 文件仓库中$CVSROOT 目录下的文件。 
  
(2) 删除、增加、重命名文件和目录  
cvs add [-k kflags][-m message] files...  

-k 指定以后该文件的缺省检出目录  
-m 对文件的描述  

上述命令会加入一个新的文件到文件仓库里,但直到使用了提交命令它才会真正 
更新文件仓库。  

cvs remove [options] files  

上述命令会从文件仓库中删除文件,但也要到提交之后才有作用。  
例1:增加文件  
$cvs checkout SOURCE  
$cd cvstest/c  
$touch test.c  
$cvs add test.c  
$cvs commit –m “add test.c”  

例2:删除文件  
$cvs checkout SOURCE  
$cd cvstest/c  
$rm test.c  
$cvs remove test.c  

使用 –f 选项能上面两步合做一步。  
$cvs remove –f test.c  

如果在提交之前想恢复刚才删除的文件,可以如下:  
$cvs add test.c  
如果只执行了第一步删除(rm),则可以用下面的方法恢复:  
$cvs update test.c  

对于重命名的文件,可以先删除再添加。  

对于目录的修改(重命名),可能需要修改cvs 管理文件,一般应该遵循以下步 
骤:  
1) 确认所有有关的修改都已经提交;  
2) 进入文件仓库中要修改的模块目录,对相应的目录进行修改(重命名或删除) 
  
$cd $CVSROOT/modules  
$mv old_dir new_dir  
3) 如果有必要,修改管理文件,比如modules 文件  
如果要删除目录,则应该先对目录中每个文件都进行了删除(包括使用cvs remo 
ve )处理之后再执行上面的第2步。  
(3) 提交源文件  
cvs commit [-Rl][-m mesg] files  

-R 连子目录一起提交  
-l 只提交本地目录(不提交子目录)  
-m 注释信息  

在检出源文件之后,在工作目录中对源文件进行的所有修改都必须在提交之后才 
能对文件仓库中的源文件起作用,并且新的文件才能够被分配一个新的版本号。 
  
(4) 释放工作目录  
cvs release –d SOURCE  

这个命令会删除工作目录 cvstest/c (建议在提交了修改的模块后执行这一步) 
, 它比使用 rm –rf cvstest 要好。  

3. 多用户开发  
---------------  
在多用户的情况下,如果不同用户修改的是同一个文件的不同部分,则使用下面 
的命令就能进行版本合并(把检出的文件与当前的最新版本合并):  
$cvs update  
(1) 冲突解决  
在有多个用户对同一个文件进行修改时,如果修改了其中的相同部分,而修改后 
的内容如果有不同的话,出现冲突是不可避免的。如果在CVS 文件仓库中有一个 
文件 test.c ,它的版本是 1.4, 用户A 先检出该文件进行修改,而稍后有用户 
B 检出该文件进行修改,并提前提交成 1.5, 而在用户A再提交时就会出现冲突 
(如果文件内容不同的话),这时CVS会提示需要手工解决。  
文件仓库中的版本1.4:  
#include <stdio.h>  
main()  
{  
int i;  
for(i = 0; i < 100; i  )  
printf(“Count: %d\n”, i);  
}  
用户B 1.5:  
#include <stdio.h>  
main()  
{  
int i;  
for(i = 0; i < 10; i  )  
printf(“Count: %d\n”, i);  
printf(“Over\n”);  
}  
用户A :  
#include <stdio.h>  
main()  
{  
int i;  
for(i = 0; i < 50; i  )  
printf(“Count: %d\n”, i);  
return;  
}  
提交时会提示有冲突,需要手工编辑,这时运行了$cvs update 之后再编辑test 
.c, 会看到:  
#include <stdio.h>  
main()  
{  
int i;  
<<<<<<< test.c  
for(i = 0; i < 50; i  )  
=======  
for(i = 0; i < 10; i  )  
>>>>>>> 1.5  

printf("Count: %d\n", i);  
<<<<<<< test.c  
return;  
=======  
printf("Over\n");  
>>>>>>> 1.5  
}  
(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 annotate cvstest/c/test.c  
输出:  
版本 修改人 修改时间 源代码  
1.1 (tang 18-Jan-00): #include <stdio.h>  
1.1 (tang 18-Jan-00): #include <string.h>  
1.1 (tang 18-Jan-00):  
1.1 (tang 18-Jan-00): main()  
1.1 (tang 18-Jan-00): {  
1.1 (tang 18-Jan-00): int i = 0 ;  
1.1 (tang 18-Jan-00):  
1.1 (tang 18-Jan-00): for(i = 0; i < 20; i  )  
1.1 (tang 18-Jan-00): printf("Count: %d\n", i);  
1.1 (tang 18-Jan-00):  
1.3 (tang 18-Jan-00): printf("222222\n");  
1.4 (tang 18-Jan-00): printf("333333\n");  
1.1 (tang 18-Jan-00): }  

使用下面的命令可以生成相对于一个指定主版本的分支版本:  
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  

把当前所做的修改与指定版本的文件进行合并。  

主干 1.1 ? 1.2 ? 1.3 ? 1.4 ? 1.5 ?  
1.6  
↓  
分支tlb-1 ? 1.2.2.1 ? 1.2.2.2 ? 1.2.2.3  

如果要合并分支tlb-1上的版本:  
$cvs update –j 1.2.2.3 –j tlb-1 test.c  
其中1.2.2.3可以通过tag命令生成一个容易记忆的标识。  

如果要合并分支tlb-1到主干上1.2 :  
$cvs update –j tlb-1 test.c  

如果要合并主干上的不同版本(注意顺序很重要,同时在指定版本之间的所有修 
改将被丢弃):  
$cvs update –j 1.5 –j 1.2 test.c  

如果在不同版本之间模块的文件有增减,则可以:  
$cvs update –A  
$cvs updata –jbranch_name  

4. 在远程机器上使用CVS  
----------------------  
通过网络使用CVS 有很多种方式,但在这里只介绍比较简单的一种:通过rsh 执 
行cvs 命令。  
1) 在远程机器的.rhosts中加入对本地机的访问许可:  
tom tang  

2) 使用下面的命令检出模块ESMSTRG  
$cvs –d :ext:tang@esmpro:/work/cvsroot checkout SOURCE  

其中, ext 指明了连接方式为 rsh, tang 指明了本地用户, esmpro 指明了远 
地主机,/work/cvsroot 指明了在远地主机上的$CVSROOT路径,可以在本地设置 
CVS_SERVER环境变量指明这个目录。  

5. 参看帮助  
----------------  
cvs –H command  

可以参看指定命令的帮助信息。  

 

最新文章
·Subversion比CVS更好用  (2005年03月18日)
·CVS使用速成配置  (2005年03月18日)
·CVS服务器建立和权限配置  (2004年08月23日)
·CVS简单教程  (2004年08月23日)
·CVS使用经验谈  (2004年04月21日)
·使用CVS进行版本管理  (2004年04月21日)





 
 
Copyright © 1999-2005 GZICP.com All Rights Reserved