CVS客户端使用指南
Jul 8,2002 Farhill of CyberHome
  CVS是Concurrent Version System(并行版本系统)的缩写,用于版本管理。在原先Unix 体系里很成熟的SCCS (Source Code Control System)和 RCS (Revision Control System)的基础上发展而来。
  CVS 的基本工作思路:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序,这样,就好象只有一个人在修改文件一样,避免了冲突,每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用cvs 命令进行提交,由 cvs 仓库管理员统一修改。这样就可以做到跟踪文件变化,冲突控制等等。由于CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分,不过大多数 CVS 软件都把它们合二为一了。这里服务器配置已完成,我只对客户端配置进行说明。
  一、客户端设置
  ㈠、Linux客户端配置 Linux客户端和服务器端的软件是一样的,一般Linux上已经预装,可以使用#rpm -qa|grep cvs进行查询其版本,如果没有,请到网站上下载cvs-1.11.1p1.tar.gz解包安装,然后设置环境变量CVSROOT:
  $export CVSROOT=:pserver:你的用户名@192.168.1.12:/cvsroot
你也可以把这行放到你的shell的profile里(.bash_profile,.profile等),这样就不用每次敲一长串命令了。
  登陆CVS服务器:
  $cvs login
  这时候cvs 会问你口令,请把你在 CVS 服务器上的口令敲进去Passwd:xxxxxxxx 客户端设置完成。
  ㈡、Windows平台客户端配置
  首先安装支持平台软件\Python-2.2.1
  然后安装客户端 wincvs(Windows下客户端)的配置
  启动wincvs,在Admin菜单中选择preferences然后在general页中设置CVSROOT。验证方式选择:
  pserver
  路径/cvsroot
  主机:192.168.1.12
  用户:suntest(这是我开的帐户,大家也可以使用,密码也是suntest)
  CVSROOT:项如下所示:
  suntest@192.168.1.12:/cvsroot
  执行Admin菜单中的login,在提示框中输入口令,如果在Output窗口出现以下提示:

*****CVS exited normally with code 0*****
  0就表示现在可以在Windows下使用cvs服务了。

二、客户端管理

登录成功后,如何使用wincvs把自己的项目加到cvs中去。建立一个新的CVS项目,比如叫 cvstest:

首先在Create项中选择Import module目录,改变默认工作路径到当前工作路径(本地源代码目录)。确认你想加入的源文件全部在一个目录下。这个目录仅仅应当包含源文件,不应有其它任何的可执行体、*.O,*.class...等类型的文件。

其次在wincvs“Modules”窗口中把包含你的源文件的目录选中,然后在菜单“Create”->”Import moudule”下选择目录,把它导入CVS在文件过滤之后点击继续,在Import setting设置项中填入如下几项,如:

目录文件名:cvstest

开发商标记:CyberHome

版本标记:V_0_0_1

进入信息:Hello!

CVS客户端提示信息如下:

Filtering 'F:\cvstest'...

Filtering 'F:\cvstest'...

Filtering 'F:\cvstest'...

cvs import -I ! -I CVS -W "*.dll -k 'b'" -m Hello! cvstest WiLAN V_0_0_1 (in directory F:\cvstest)

N cvstest/jfb_client.ini

N cvstest/pbsys60.dll

N cvstest/pbvm60.dll

N cvstest/setup.ini

N cvstest/hello.c

N cvstest/inputtest.c

N cvstest/leap.c

No conflicts created by this import

*****CVS exited normally with code 0*****

其它相关的内容请看wincvs文档。

这样我们就建立了一个CVS仓库了,然后,我们可以把这个测试项目文件cvstest删除。试验一下如何从仓库获取文件。

在运行下面的命令:在菜单“Create”->” Checkout moudule”下选择目录,选择CVS服务器端的文件名cvstest,导出到当地的文件名如F:\cvstest。提示信息如下所示:

cvs checkout -P cvstest (in directory F:\cvstest)

cvs server: Updating cvstest

U cvstest/hello.c

U cvstest/inputtest.c

U cvstest/jfb_client.ini

U cvstest/leap.c

U cvstest/pbsys60.dll

U cvstest/pbvm60.dll

U cvstest/setup.ini

*****CVS exited normally with code 0*****

更新选择($cvs checkout cvstest如果做过,输入$cvs update) 在菜单“Modify”->”Update selection”下确认,提示信息如下所示:

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

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

cvs update -P (in directory F:\cvstest\cvstest\)

cvs server: Updating .

*****CVS exited normally with code 0*****

如果你要选择具体细节,可进行参数设置。若你不直接更新,只是想看看有没有更新的东西,那么($cvs status) 在菜单“Query”->”Status”下确认,这时后会打印出一长串状态报告(你可能需分页显示,或者定向到一个输出文件里慢慢看。),对项目中的每个文件有一份状态报告,提示信息如下所示:

cvs status (in directory F:\cvstest\cvstest\)

cvs server: Examining .

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

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

Working revision: 1.1.1.1

Repository revision: 1.1.1.1 /cvsroot/cvstest/hello.c,v

Sticky Tag: (none)

Sticky Date: (none)

Sticky Options:(none)

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

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

Working revision: 1.1.1.1

Repository revision: 1.1.1.1 /cvsroot/cvstest/inputtest.c,v

Sticky Tag: (none)

Sticky Date: (none)

Sticky Options:(none)

...

*****CVS exited normally with code 0*****

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

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

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

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

Needs Merge:表明你曾经修改过该文件,也有其它人修改了这个文件,而且还提交给仓库了!

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

1,我对某个文件做了修改,比如说改了hello.c,加了一行程序:printf("This is WiLAN Web!\n");

改完之后把修改提交给仓库,用命令($cvs commit -m "add a hint!" hello.c)在菜单“Modify”->”Commit”下确认,让cvs帮你检查哪个文件需要提交。

2,当我再一次修改该文件后,可能我先查看一下现在状态($cvs status),这时候我会看到:

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

File: hello.c Status: Locally Modified

Working revision: 1.2

Repository revision: 1.2/cvsroot/cvstest/hello.c,v

Sticky Tag: (none)

Sticky Date: (none)

Sticky Options:(none)

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

如果我没有查看现在状态就做更新,而你已经做了修改并且进行提交,就会出现如下提示:

cvs update -P (in directory F:\cvstest\cvstest\)

cvs server: Updating .

RCS file: /cvsroot/cvstest/hello.c,v

retrieving revision 1.2

retrieving revision 1.3

Merging differences between 1.2 and 1.3 into hello.c

rcsmerge: warning: conflicts during merge

cvs server: conflicts found in hello.c

C hello.c

*****CVS exited normally with code 0*****

如果我没有查看现在状态就做提交。出现如下提示:

cvs commit -m "suntest update!" (in directory F:\cvstest\cvstest\)

cvs commit: Examining .

cvs server: Up-to-date check failed for `hello.c'

cvs [server aborted]: correct above errors first!

这说明确实人在我修改此文件的时候也做了修改,并且做了提交。

查看一下现在状态,提示如下:

cvs status (in directory F:\cvstest\cvstest\)

cvs server: Examining .

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

File: hello.c Status: Needs Merge

Working revision: 1.2

Repository revision: 1.3/cvsroot/cvstest/hello.c,v

Sticky Tag: (none)

Sticky Date: (none)

Sticky Options:(none)

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

解决办法就是重新编辑hello.c,这时一般文件里看起来象这样。

<<<<<<< hello.c

printf("I am a designer!\n");

=======

printf("The sentence is right.\n");

>>>>>>> 1.3

于是我把上面改成:

printf("I am a designer!\n");

printf("The sentence is right.\n");

然后提交,提示如下:

cvs commit hello.c (in directory F:\cvstest\cvstest\)

Checking in hello.c;

/cvsroot/cvstest/hello.c,v <-- hello.c

new revision: 1.4; previous revision: 1.3

done

*****CVS exited normally with code 0*****

我这里没有更新,直接做了提交,若是更新,下回你再更新的时候就有新的补钉要打,如此往复,直到完成所有修改。

不过这里有一些要注意的地方就是删除程序,如果你删掉一行对你可能没有用的程序。而我不想删除(因为我有用),而我不知情地直接更新,那么我的那行程序也完蛋了,所以这里我们要注意所有开发人员的协调,千万不要乱删东西,大不了用注释符号括起来。实在要删东西,那最好先标记一个版本($cvs tag v_0_0_1)然后你可以发布并删除你自己的工作目录里这个版本的文件($cvs release -d cvstest注意不是删除仓库里的)。然后你再生成一个新分支($cvs rtag -b -r v_0_0_1 v_0_0_1_1 cvstest)然后再建立v_0_0_1_1的分支($cvs checkout -r v_0_0_1_1 nasdaq )编辑并修改这个分支的文件,这样的做法比较好。

不过要注意的是,新标记和新分支的建立最好由项目的管理人员负责,否则每个人都做一个分支,那么仓库就太乱了。因此,比较的开发人员之间的直接沟通是不能忽略的。一般来说,在互联网上的标准模式是有一个管理员(可能自己并不写程序),有一个邮递列表,大家都在邮递列表上交流看法和做各种决议。当形成决议之后,管理员做一个新版本的标记。以此循环。

还有一些命令,比如要增加一个文件 stocks_list:($cvs add stocks_list)然后还要:($cvs commit stocks_list)看起来有点象数据库里的事务?的确是这样。CVS维护着一个本地的参考文件(在CVS/Entries里),这样提交的时候就可以一次地把所有改变放到服务器端,这样也更安全。同样,如果想删除文件 web_site:($rm web_site $cvs remove web_site $cvs commit web_site)。

好了,上面所有的东西,可能就是我们用cvs时大部分用的命令和内容,包括文件的更新,提交,冲突的解决,分支的派生,增删文件等。当然,还要更多地参考别的文档。你若发现有不对之处请及时通知我,我将及时更改。

 

    【打印本稿】  【给我留言】