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时大部分用的命令和内容,包括文件的更新,提交,冲突的解决,分支的派生,增删文件等。当然,还要更多地参考别的文档。你若发现有不对之处请及时通知我,我将及时更改。
|