分享
 
 
 

使用CVS进行项目开发管理

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

在多人共同开发一个大型项目时,源代码的维护和版本维护是一件令人头疼的事情,由于多人开发,每个开发人员都拥有此项目的副本,所以如果要手动维护同一个文件多人的修改是十分困难的事情。

另外,可能你需要的项目的版本不是当前开发的最新的版本, 如果为了这个目的而为每一个版本保留一个备份几乎是不可能的。Linux平台上提供了一个功能软件:CVS。众所周知,Linux的发展得益于互联网的发展,大部分的软件都是众多开发者在互联网上共同开发的,这些软件的维护大部分都使用CVS,例如Deban Linux的开发、KDE的开发,以及sourceforg上的开发项目。正确熟练使用CVS是一个Linux程序员基本的素质。

CVS不仅可以维护源代码,事实上,所有的文本文件都可以使用CVS来管理,当然也可以管理 二进制文件,只是需要特殊的命令选项罢了。

CVS把文件保存在一个名叫仓库(repository)的地方,仓库中保存的文件并不是每个版本的副本,而是可以从任意版本回溯到初始版本的一些代码的主控信息,这样,就节省了大量的存储空间。

仓库不仅可以建立在本机上,也可以建立在网络上。另外CVS支持版本分支(tag),这样可以从任意的版本中衍生出另外一个版本进行开发,必要时,还可以把这个分支合并到主开发分支去。

CVS需要一个名叫RCS(修订控制系统)的软件,确切说,CVS主要管理开发项目中的目录的改动,而RCS则侧重于管理的一个文件的改变。如果要使用网络的CVS,还需要rsh或者自己内置的cvs-server,rsh是CVS客户于服务器的通信平台,如果需要安全的信息传输,可以使用ssh,这个可以使用CVS_RSH环境变量来指定:

export CVS_RSH=rsh 使用rsh

export CVS_RSH=ssh 使用ssh

RCS使用

在使用CVS之前,先介绍一下RCS的使用方法。

正如前面所说,RCS是针对某一个特定的文件进行管理,常用到的命令是co和ci。RCS使用当 前工作路径下的RCS目录来存储管理的文件。

ci (check in)把源代码加入到RCS源代码仓库中,每一个添加进代码库中的文件的版本是 1.1。

以后每次修改文件重新ci以后,此文件的版本递增为1.2 ,1.3.……。

co(check out)把源文件从RCS源代码仓库中取出,缺省的版本是最新的版本,如果你需要一个指定的版本,则需要使用-r选项指定。例如:

$mkdir RCS 建立RCS源代码仓库

编辑一个文件,如hello.c

#include <stdio.h

int main (void)

{

printf ("Hello World\n");

return 0;

}

然后把它加入到RCS仓库中:

[kerberos@power zhyf]$ ci hello.c

RCS/hello.c,v <-- hello.c

enter description, terminated with single '.' or end of file:

NOTE: This is NOT the log message!

the inital verion. 输入关于文件改动的信息

. 以.结束信息输入

initial revision: 1.1 初始版本是1.1

done

[kerberos@power zhyf]$

当文件加入到源代码仓库后,RCS会自动删除文件。

如果需要修改文件,则从仓库取出:

[kerberos@power zhyf]$ co hello.c

RCS/hello.c,v -- hello.c

revision 1.1

done

此时,取出的文件是只读的,如果需要编辑文件,需要对文件加锁取出,防止与他人编辑冲突。

加锁取出使用-l (lock)选项。

[kerberos@power zhyf]$ co -l hello.c

RCS/hello.c,v -- hello.c 从RCS仓库中取出hello.c,仓库中的文件是以v结尾的。

revision 1.1 (locked) 指明是加锁取出

done

这时,我们就可以修改和编辑文件了。

例如:

#include <stdio.h

int main (void)

{

printf ("Hello World\n");

printf("checkoutwithlock\n"); 添入代码

return 0;

}

[kerberos@power zhyf]$ ci hello.c

RCS/hello.c,v <-- hello.c

new revision: 1.2; previous revision: 1.1 重新加入到仓库,文件版本递增为1.2

enter log message, terminated with single '.' or end of file:

check out with lock and modified it .

.

done

如果你需要先前的hello.c,也就是1.1版本的,可以使用-r来指定取出文件的版本:

[kerberos@power zhyf]$ co -l -r1.1 hello.c

hello.c,v -- hello.c

revision 1.1 (locked) 取出1.1版本

done

可以尝试使用两次加锁取出,这时候,RCS会提示警告信息。

[kerberos@power zhyf]$ co -l hello.c

hello.c,v -- hello.c

revision 1.1 (locked)

writable hello.c exists; remove it? [ny](n) 是否覆盖当前的hello.c

如果回答n,则取出失败,回答是则覆盖当前文件与-l相反的选项是-u,取出不加锁的文件用于工作。-f则在ci时强制覆盖RCS仓库中的文件,在co时强制覆盖当前的文件。

在RCS中,支持类似于宏的关键字,在ci后,这些关键字会被RCS替换成特定的信息,如$Id$关键字:

/*$Id

*/

#include <stdio.h

int main (void)

{

printf ("Hello World\n");

printf("checkoutwithlock\n");

return 0;

}

ci 之后,然后取出,文件将变成:

/*$Id: hello.c,v 1.3 2001/02/22 16:16:58 kerberos Exp kerberos $

*/

#include <stdio.h

int main (void)

{

printf ("Hello World\n");

printf ("check out with lock\n");

return 0;

}

$Id$ 关键字是用文件名、版本、时间、作者 及代码性质替换,如果使用-l选项取出,在Exp后面会加上登录用户的名称。除了$Id$关键字,RCS还支持下面常用的关键字:

$Log$ : 你所提供的修改日志信息。

$Author$ :存入该版本的作者。

$Locker$ : 该版本的加锁者

$State$ : 该版本的状态 Exp(试验版), Stabe(稳定版), Rel(发行版).缺省是Exp

$Date$ : 该版本存入的时间,使用UTC时间格式。

$Revision$ : 该版本的版本号

$RCSfile$ : RCS文件名

$Source$ : RCS全路径名

$Name$ : 取回该版本的符号名

$Header$ : 相当于$ Source $$ Revision$$Date$$Author $$State$$Locker$的组合在UNIX/Linux下有一个diff工具可以比较两个文件的不同,rcsdiff可以在不同的版本之间比较文件的不同,而不必取出文件,如:

rcsdiff hello.c 比较当前hello.c文件与RCS仓库中最新版本的区别。

rcsdiff -r1.1 hello.c 比较当前hello.c文件与hello.c的1.1版本的区别。

rcsdiff -r1.2 -r1.1 比较hello.c 文件的1.1版本和1.2版本的区别。

使用这个命令,可以很方便的做出任意版本之间的补丁文件。

另外,还有其他一些不常用的RCS命令,读者可以参考更详细的资料。

CVS使用

下面我们就讲一下CVS的使用和管理。

在使用CVS之前,必须要指定CVS的根路径,不像RCS是工作在工作目录下的RCS目录下。指定CVS路径的方法有两种,一种是使用cvs-d 选项指定,如:

cvs -d /home/kerberos/cvsroot 指定/home/kerberos/cvsroot为CVS仓库的路径。

另外一种是使用CVSROOT环境变量指定(bash下):

export CVSROOT=/home/kerberos/cvsroot

无论何种方式,每当重新开启一次终端会话,CVS仓库的路径都要重新设置,你可以把以上的后者加入到其实目录下的.bashrc文件中,这样开启一次终端会话后,不需要重新设置了(对于其他的环境变量的设置也是如此)。如果你的CVSROOT环境变量已经存在,可以使用cvs -d 选项来指定不同于CVSROOT所指定的CVS仓库。然后初始化CVS仓库,建立CVS维护所需要的一些文件和信息,CVS把这些信息存放在CVS仓库主目录的CVSROOT目录下。这些文件,除了modules ,其他文件都没有手动修改的必要,modules 文件定义了CVS的导出模块在CVS仓库中的位置,这一点在从CVS仓库中导出一个深层目录时是非常方便的。

cvs init

初始化之后,我们使用cvs import来把需要进行版本维护的开发项目的目录结构导入到CVS仓库中,如下:

建立好项目的目录结构以后,当前的testprj目录的结构是这样的:

[kerberos@power zhyf]$ tree testprj

testprj

|-- admin

|-- doc

|-- include

|-- libs

`-- src

|-- include

`-- main

7 directories, 0 files

cvs import有三个参数:第一个是这个目录树在CVS仓库中的模块名称,第二个是发布者的一个标志,第三个是这个项目的版本标记(tag)。下面,我们把testprj导入到CVS仓库中,使用testprj 模块名称。

[kerberos@power testprj]$cvs import testprj KERBEROS INITVER

执行命令以后,CVS会调用CVSEDITOR指定的编辑器来让你输入日志,如果CVSEDITOR没有定义,缺省调用vi,可以使用export命令指定你自己喜欢使用的编辑器。输入日志以后,CVS把当前的目录结构导入CVS仓库中,并且使用testprj这个模块名称,在导出文件时,就可以使用

cvs co testprj 来导出。

"/tmp/cvscVxZnW" 5L, 242C written

cvs import: Importing /home/zhyf/cvsroot/testprj/admin

cvs import: Importing /home/zhyf/cvsroot/testprj/libs

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有