分享
 
 
 

CVS 速成班

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

结合文档和一些网上资源,折腾了半天终于搞定了CVS,我写一点非常简单的"速成"的教材.希望对大家有用.

下面是我的步骤和做法.

1,要求:

root 权限;

CVS软件,请找到相关的rpm,tgz,deb 等包装上,或者到

http://www.cvshome.org/CVS/Dev/code

下载原程序编译安装,这里我不准备介绍它的安装,请参考CVS自身的文档安装.

我使用Slackware的tgz包,安装的命令是

#installpkg cvs*.tgz

其他包请参考对应包管理工具的命令.

一定的系统资源,要有一定内存(32M就能工作得很好),要一定的磁盘空间,看你的项目的大小和多少而定.

2,架设CVS服务器:

建立CVSROOT目录,因为这里涉及到用户对CVSROOT里的文件读写的权限问题,所以比较简单的方法是建立一个组,然后再建立一个属于该组的帐户,而且以后有读写权限的用户都要属于该组.假设我们建一个组cvs,用户名cvsroot.建组和用户的命令如下

#groupadd cvs

#adduser cvsroot

生成的用户家目录在/home/cvsroot(根据自己的系统调整)

用cvsroot用户登陆,修改 /home/cvsroot (CVSROOT)的权限,赋与同组人有读写的权限:

$chmod 771 . (或者770应该也可以)

注意:这一部分工作是按照文档说明做的,是否一定需要这样没有试验,我会在做试验后在以后版本的教程说得仔细一点.如果您有这方面的经验请提供给我,谢谢.

建立CVS仓库,(仍然是cvsroot用户),用下面命令:

$cvs -d /home/cvsroot init

以root身份登陆,修改/etc/inetd.conf 和 /etc/services,分别加入下面一行:

在 /etc/inetd.conf 里加入:

cvsserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=/home/cvsroot pserver

说明:上面的行是单独一整行,/usr/bin/cvs 应该是你的cvs版本的命令路径,请根据自己的系统调整./home/cvsroot 是你建立的CVSROOT的路径,也请根据上面建立目录的部分的内容做调整.

在/etc/services里加入:

cvsserver 2401/tcp

说明:cvsserver是任意的名称,但是不能和已有的服务重名,也要和上面修改/etc/inetd.conf那行的第一项一致.这里我用的是CVS的口令认证方式,CVS还有其他认证方式,我没有做试验,如果您有经验,请补充,谢谢.

添加可以使用CVS服务的用户到cvs组:

以root身份修改/etc/group,把需要使用CVS的用户名加到cvs组里,比如我想让用户laser和gumpwu能够使用CVS服务,那么修改以后的/etc/group应该有下面这样一行:

cvs:x:105:laser,gumpwu

在你的系统上GID可能不是105,没有关系.主要是要把laser和gumpwu用逗号分隔开写在最后一个冒号后面.当然,象RedHat等分发版有类似linuxconf这样的工具的话,用工具做这件事会更简单些.

重起inetd使修改生效:

#killall -HUP inetd

这样服务器就设置完成了.我们接着搞客户端.

3,设置客户端,如果是Linux(或者其他*nix),客户端和服务器端的软件是一样的,如果是Win,MAC等平台,请到http://www.loria.fr/cgi-bin/molli/wilma.cgi/rel 找相应的客户端软件,这里我先说一下在Linux(*nix)里怎么做:

设置环境变量CVSROOT:

$export CVSROOT=:pserver:laser@the_server_name:/home/cvsroot

注意:这里的pserver是访问方式,我在上面设置的是口令认证,所以这里是pserver,如果你的CVS服务器设置成别的访问模式,那么需要相应修改.laser是可以使用 CVS服务器的用户名,这里可以根据你的设置修改,我在这个版本设置的是直接使用系统用户的口令文件,也就是说laser必须是CVS服务器上的合法用户,这里当然有安全问题,CVS可以设置成为拥有自己的用户,我将在以后的版本里面增加这些内容,或者您也可以提供一些补充,或者直接读CVS的文档.the_server_name是CVS服务器的名称或者IP地址,根据你的情况填写,/home/cvsroot是你的CVS服务器的CVSROOT目录,根据你的CVS服务器设置做修改或者询问管理员.你可以把这行放到你的shell的profile里(.bash_profile,.profile等)这样就不用每次敲一长串命令了.

登陆CVS服务器:

$cvs login,这时候cvs会问你口令,请把你在CVS服务器上的口令敲进去,这里是laser在CVS服务器上的系统用户的口令:

Passwd:xxxxxxxx

成功登陆后将在你的家目录建立一个.cvspass文件,以后就不用输入口令了.好,客户端设置完成,简单吧.

现在服务器和客户端都设置好了,那么怎么用呢,我在这里写一个最简单的(估计也是最常用的)命令介绍:

首先,建立一个新的CVS项目,一般我们都已经有一些项目文件了,这样我们可以用下面步骤生成一个新的CVS项目:

进入到你的已有项目的目录,比如叫cvstest:

$cd cvstest

运行命令:

$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start

说明:import 是cvs的命令之一,表示向cvs仓库输入项目文件. -m参数后面的字串是描述文本,随便写些有意义的东西,如果不加 -m 参数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量

EDITOR来改成你喜欢用的编辑器.)让你输入信息, cvstest 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里.)

v_0_0_1是这个分支的总标记.没啥用(或曰不常用.)

start 是每次 import 标识文件的输入层次的标记,没啥用.这样我们就建立了一个CVS仓库了,然后,我们可以把这个测试项目的文件删除.试验一下如何从仓库获取文件.这里我假设上面的所有客户端工作你都已经做过了.

运行下面的命令:

$cvs checkout cvstest

从仓库中检索出cvstest项目的源文件.

如果你已经做过一次checkout了,那么不需要重新checkout,只需要进入cvstest项目的目录,更新一把就行了:

$cd cvstest

$cvs update

一下即可.又或者你不想直接更新,只是想看看有没有更新的东西,那么:

$cvs status

这时后会打印出一长串状态报告(你可能需要用类似less这样的命令分页显示,或者定向到一个输

出文件里慢慢看.),对项目中的每个文件有一份状态报告,类似这样:

=================================================================

File: foo.c Status: Up-to-date

Working revision: 1.1.1.1 Some Date

Repository revision: 1.2 /home/cvsroot/cvstest/foo.c,v

Sticky Tag: (none)

Sticky Date: (none)

Sticky Options: (none)

这里最重要的就是 Status 栏,这里总共可能有四种状态:

Up-to-date:表明你要到的文件是最新的.

Locally Modified:表明你曾经修改过该文件,但还没有提交,你的版本比仓库里的新.

Needing Patch:表明有个哥们已经修改过该文件并且已经提交了!你的版本比仓库里的旧.

Needs Merge:表明你曾经修改国该文件,但是偏偏有个不识相的也修改了这个文件,而且还提交给仓库了!

如果你只是想保持软件的同步的话(象我),那么上面的东西就足够用了.可是如果多人协作开发项目的话,可就不是了这么简单了.当你参加项目,维护文件时,就需要更多命令,比如说你我都是某nasdaq项目的开发人员:

1,你对某个文件做了修改,比如说改了ceo.c,加了一行程序:printf("where can I find VC to cheat!");

改完之后你要把修改提交给仓库,用命令:

$cvs commit -m "add a complain" ceo.c

或者就是:

$cvs commit -m "worry about money"

让cvs帮你检查哪个文件需要提交.

2,当我开始干活的时候,可能我先:

$cvs status

一把,这时候我会看到:

================================================================

File: ceo.c Status: Needing Patch

Working revision: 1.1.1.1 Some Date

Repository revision: 1.2 /home/cvsroot/nastaq/ceo.c,v

Sticky Tag: (none)

Sticky Date: (none)

Sticky Options: (none)

于是我知道有人改了ceo.c,于是我就:

$cvs update ceo.c

或者干脆:

$cvs update

把ceo.c这个文件更新为最新版本,然后再干活.然后提交.

如果这天你修改了coo.c,加了一行 puts("how about another kind of bragging?");

并且提交了,但是这时候我已经 $cvs status 过了,就是说我不知道你的修改.

而我加了一行printf("You must shamelessly and seems knowingness to act as a coo");

并且傻乎乎地提交:

$cvs commit coo.c

这时候,CVS会告诉我

cvs commit: Examing .

cvs server: Up-to-date check failed for coo.c

cvs [server aborted]: correct above error first!

于是我知道有个狗屎在我修改文件的当口做了提交,于是我

$cvs update

这时cvs会报告:

RCS file: /home/cvsroot/nasdaq/coo.c,v

retrieving revision 1.1.1.1

retrieving revision 1.2

Merging differences between 1.1.1.1 and 1.2 into coo.c

rcsmerge: warning: conflicts during merge

cvs update: conflicts found in coo.c

C coo.c

告诉你coo.c有版本冲突,于是我编辑coo.c,这时一般文件里看起来象这样:

...

printf("You must shamelessly and seems knowingness to act as a coo");

<<<<<<< foo.c

=======

...

puts("how about another kind of bragging?");

>>>>>>> 1.2

...

于是我把上面改成:

printf("You must shamelessly and seems knowingness to act as a coo");

puts("how about another kind of bragging?");

然后

$cvs commit -m "merged" coo.c

于是下回你再更新的时候就有新的补钉要打...如此往复,直到完成所有修改.

不过这里有一些要注意的地方就是删除程序,如果你删掉一行对你可能没有用的程序

puts("to be honest"); 而我不想删除(因为我有用),而我不知情地直接:

$cvs update

了,那么我的这行程序也完蛋了,所以这里我们要注意所有开发人员的协调,千万不要

乱删东西,大不了用

#if 0

#endif

宏定义对括起来.实在要删东西,那最好先标记一个版本:

$cvs tag v_0_0_1

然后你可以发布并删除你自己的工作目录里这个版本的文件(注意:不是删除仓库里的.):

$cvs release -d nasdaq

然后你再生成一个新分支:

$cvs rtag -b -r v_0_0_1 v_0_0_1_1 nasdaq

然后再建立v_0_0_1_1的分支

$cvs checkout -r v_0_0_1_1 nasdaq

编辑并修改这个分支的文件,这样的做法比较好.

还有一些命令,比如要增加一个文件 garbage_china_concept_stocks_list:

$cvs add garbage_china_concept_stocks_list

然后还要:

$cvs commit garbage_china_concert_stocks_list

看起来有点象数据库里的事务?的确是这样.CVS维护着一个本地的参考文件(在CVS/Entries里),

这样提交的时候就可以一次地把所有改变放到服务器端,这样也更安全.

同样,如果想删除文件 bankrupted_web_site:

$rm bankrupted_web_site

$cvs remove bankrupted_web_site

$cvs commit bankrupted_web_site

好了,上面所有的东西,估计就是我们用cvs时80%情况下用的命令和内容,包括文件的更新,提

交,冲突的解决,分支的派生,增删文件等.实际上cvs的功能之强大,远远超出我在这里描述的

内容,我这个"速成"也就管不了太多了,希望随着时间的推移,我们能够更加有效地使用CVS.

也希望大家能够不断补充这篇文章,最后能够成为手册,而不仅仅是速成.当然,还要更多地参考

别的文档.

参考资料:

http://www.loria.fr/cgi-bin/molli/wilma.cgi/doc.865331095.html

http://www.loria.fr/~molli/cvs/doc/cvs_toc.html

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