当前位置: 首页 > 图文教程 > 服务器 > Linux服务器 > LINUX作CVS服务器之三

Linux服务器
Linux上双网卡绑定方法(Suse9SP3)
Linux操作系统调优参数的意义
Linux下使用SSH客户端及其Sftp文件传送
教你恢复被误删除的Linux文件
SQL Server注入大全及防御
Linux无法解析域名的解决办法
Linux系统下安装和配置MyEclipse的方法
Ubuntu下VirtualBox 1.4.0设置文件共享
Windows与Linux系统共享StarDict字典文件
修改Linux下相关的登陆信息
Windows通过SecureCRT远程登录Linux主机
Linux操作系统如何修改SWAP交换区的大小
Linux操作系统下为Apache目录添加密码
Linux时间设置与同步(NTP)
Linux内核补丁AMD旁路转换缓冲(TLB)错误
Linux架设DHCP服务器的方法
Fedora 8下Apache配置与管理
Linux操作系统下用单网卡捆绑双IP的方法
Ubuntu Linux系统环境变量配置文件
SUSE Linux中将Tomcat作为Service运行

Linux服务器 中的 LINUX作CVS服务器之三


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-18   浏览: 56 ::
收藏到网摘: n/a


3.在管理中的相关技术

3.1在管理源文件的一种技术叫"关键字替换".在每次执行"cvscommit"操作后源文件的某些关键字会被替换为可用的词

$AUTHOR$用户名

$Data$登记时的时间

$Header$标准的首部,包含RCS的完整路径名,日期,作者

$Id$除RCS文件名不完整外与$Header$同.

$Log$包含RCS的完整路径名,版本号,日期,作者和在提交时提供的日志信息.

$RCSfile$包含RCS的文件名,不包括路径名

$Revision$分配的版本号

$Source$RCS文件的完整名

$State$分配的版本的状态,由cvsadmin-s分配.

例:在cvscommit之前,main.c里有

staticchar*rcsid="$Id$";

执行cvscommit后

main.c的改行变为:

staticchar*rcsid="$Id:main.c,v1.21999/04/2915:10:14trimblefExp$";

当然,这里只是一个演示.在实际的程序开发中,这种技术有非常有用的作用,在此不多赘述.有兴趣的朋友可参考相关书籍.

3.2创建分支可以使用户对一些文件使用命令commit进行修改时不会影响主干.创建分支应首先为拟作修改的那些文件创建一个标签(tag).

标签是赋于一个文件或一组文件的符号.在源代码的生命周期里,组成一组模块的文件被赋于相同的标签.在工作目录中执行

~usr/teat/$cvstagrelease-1-0

标签创建后,就可以为其创建一个分支:

~usr/teat/$cvsrtag-b-rrelease-1-0release-1-0-pathprint

-b:创建分支

-rrelease-1-0:指定存在的标签

releas-1-0-patch:分支

print:模块名

使用cvsupdate-j选项可以将分支上的改变与本地文件拷贝合并.

~usr/teat/$cvsupdate-jrelease-1-0print.c

对源文件作必要修改后,可以用cvsrelease删除本地工作拷贝

并通知其他开发者这个模块不再使用.

~use/$cvsrelease-dtest

3.3冲突解决

在有多个用户对同一个文件进行修改时,如果修改了其中的相同部分,而修改后的内容如果有不同的话,出现冲突是不可避免的。

例如在CVS文件仓库中有一个文件test.c,它的版本是1.4,用户A先检出该文件进行修改,而稍后有用户B检出该文件进行修改,并提前提交成1.5,这样在用户A再提交时就会出现冲突,这时CVS会提示需要手工解决。

例如,文件仓库中的版本1.4:内容为:

#include

main()

{

inti;

for(i=0;i<100;i++)

printf(“Count:%d
”,i);

}

用户B1.5:

#include

main()

{

inti;

for(i=0;i<10;i++)

printf(“Count:%d
”,i);

printf(“Over
”);

}

用户A:

#include

main()

{

inti;

for(i=0;i<50;i++)

printf(“Count:%d
”,i);

return;

}

提交时会提示有冲突,这样需要手工编辑,这时如果用户A运行了$cvsupdate之后,再编辑test.c,会看到test.c的内容是这样的:

#include

main()

{

inti;

<<<<<<
for(i=0;i<50;i++)

=======

for(i=0;i<10;i++)

>>>>>>>1.5

 

printf("Count:%d
",i);

<<<<<<
return;

=======

printf("Over
");

>>>>>>>1.5

}

这样就需要,根据任务的不同,来手工修改,这是比较麻烦的,所以在真正的协作开发中,很少,对同一个文件给与,很多人相同的提交权限.

3.4文件版本管理

版本管理系统,最重要的莫过于对文件版本的管理,系统默认的版本升级使用的版本号是一定的.如果由于特殊需要,要自己定义出文件的版本号时,你可以用一下命令:

cvslog[-lR][-rrev][-ddate][-wlogin][files…]

其中,参数的意义如下:

-l不处理子目录

-R对子目录做同样处理

-r指定版本号

-d指定时间

-w指定登录名

使用下面的命令可以参看当前模块的版本号或指定文件的所有历史版本信息。

cvsannotate[-lR][-rrev|-Ddate]files

其中,参数的意义如下:

-l不处理子目录

-R对子目录做同样处理

-r指定版本号

使用下面的命令可以参看指定文件(检出之后)的所有修改信息。

$cvsannotatecvstest/c/test.c

输出依次为:版本修改人修改时间源代码

1.1(tang18-Jan-00):#include

1.1(tang18-Jan-00):#include

1.1(tang18-Jan-00):

1.1(tang18-Jan-00):main()

1.1(tang18-Jan-00):{

1.1(tang18-Jan-00):inti=0;

1.1(tang18-Jan-00):

1.1(tang18-Jan-00):for(i=0;i<20;i++)

1.1(tang18-Jan-00):printf("Count:%d
",i);

1.1(tang18-Jan-00):

1.3(tang18-Jan-00):printf("222222
");

1.4(tang18-Jan-00):printf("333333
");

1.1(tang18-Jan-00):}

使用下面的命令可以生成相对于一个指定主版本的分支版本:

cvsrtag–b–rrev_rootrev_branchfile_name

其中,参数的意义如下:

-b指定生成一个分支版本

-r指定该分支的主干节点版本号

rev_root主干版本号

rev_branch分支版本号

file_name指定文件,使用“.”表示当前目录下所有文件

使用下面的命令可以生成一个对应版本号的分支版本,由于CVS版本号是用数字表示的,而且在同一个模块下不同文件的版本完全可能是不同的,所以使用标识会更方便。

例:

$cvsrtag–b–r1.2tlb-1SOURCE

以后要访问该分支版本,可以使用“-r”选项

$cvscheckout–rtlb-1SOURCE

从当前检出的版本切换到一个分支版本:

$cvsupdate–rtlb-1SOURCE

使用下面的命令可以看版本信息:

cvsstatus[–vlR]files

其中,参数的意义如下:

-v显示所有信息

-l不显示子目录信息

-R显示子目录信息

命令:cvsupdate–jrevmodule把当前所做的修改与指定版本的文件进行合并。

如:主干1.11.21.31.41.51.6↓

分支tlb-11.2.2.11.2.2.21.2.2.3

如果要合并分支tlb-1上的版本:

$cvsupdate–j1.2.2.3–jtlb-1test.c

其中1.2.2.3可以通过tag命令生成一个容易记忆的标识。

如果要合并分支tlb-1到主干上1.2:

$cvsupdate–jtlb-1test.c

如果要合并主干上的不同版本(注意顺序很重要,同时在指定版本之间的所有修改将被丢弃):

$cvsupdate–j1.5–j1.2test.c

如果在不同版本之间模块的文件有增减,则可以:

$cvsupdate–A

$cvsupdata–jbranch_name

四、命令集

在本章的例子中,介绍了很多,命令的详细用法,其大多数是以应用的角度,来分析的.实际上.cvs拥有,大量的命令.如gcc一样cvs常用的命令也不是很多,在本节中,我们列出了一些常用的命令.力图不和以上各节中介绍的相重复.当然,限于时间和水平,在此也不可能列出cvs所有的命令.有兴趣的朋友.可以,参考,cvs的说明文档,与linux的man文档,详细学习,也可来此做出指导

1.检出源文件

cvscheckout[-rrev][-Ddate][-ddir][-jmerg1][-jmerg2]modules

其中,参数的意义如下:

-r检出指定版本的模块

-D检出指定日期的模块

-d检出指定目录而不是模块

-j合并当前版本和指定版本

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

usr$cvscheckoutproject

usr$cvscheckou