分享
 
 
 

LINUX作CVS服务器之三

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

3.在管理中的相关技术

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

$AUTHOR$ 用户名

$Data$ 登记时的时间

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

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

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

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

$Revision$ 分配的版本号

$Source$ RCS文件的完整名

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

例: 在cvs commit之前,main.c里有

static char *rcsid="$Id$";

执行cvs commit后

main.c的改行变为:

static char *rcsid="$Id: main.c,v 1.2 1999/04/29 15:10:14 trimblef Exp$";

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

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

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

~usr/teat/$cvs tag release-1-0

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

~usr/teat/$cvs rtag -b -r release-1-0 release-1-0-path print

-b :创建分支

-r release-1-0 :指定存在的标签

releas-1-0-patch:分支

print: 模块名

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

~usr/teat/$cvs update -j release-1-0 print.c

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

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

~use/$cvs release -d test

3.3 冲突解决

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

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

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

#include

main()

{

int i;

for(i = 0; i

printf(“Count: %d

”, i);

}

用户B 1.5:

#include

main()

{

int i;

for(i = 0; i

printf(“Count: %d

”, i);

printf(“Over

”);

}

用户A :

#include

main()

{

int i;

for(i = 0; i

printf(“Count: %d

”, i);

return;

}

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

#include

main()

{

int i;

for(i = 0; i

=======

for(i = 0; i

1.5

printf("Count: %d

", i);

return;

=======

printf("Over

");

1.5

}

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

3.4 文件版本管理

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

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

1.1 (tang 18-Jan-00): #include

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

1.1 (tang 18-Jan-00): printf("Count: %d

", i);

1.1 (tang 18-Jan-00):

1.3 (tang 18-Jan-00): printf("222222

");

1.4 (tang 18-Jan-00): printf("333333

");

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

四、命令集

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

1.检出源文件

cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules

其中,参数的意义如下:

-r 检出指定版本的模块

-D 检出指定日期的模块

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

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

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

usr$ cvs checkout project

usr$ cvs checkou

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有