CVS的安装和使用
拟制谢为国
CVS的安装和使用 (1)
1 CVS的相关概念和术语 (2)
2 使用CVS工作的流程 (2)
2.1 开始阶段 (2)
2.2 软件开发过程中 (3)
2.2.1 修改相关程序和模块 (3)
2.2.2 删除相关程序和模块 (4)
2.2.3 新增相关程序和模块 (4)
2.3 软件发布 (4)
3 CVS服务端安装 (4)
4 CVS客户端安装 (6)
4.1 在UNIX环境中安装CVS客户端 (6)
4.2 在Windows环境中安装客户端 (6)
5 WINCVS使用说明 (9)
5.1 从CVS 获取新模块 (9)
5.2 在程序开发过程中,从CVS同步别人的修改 (10)
5.3 增加一个程序文件或者模块 (11)
5.4 删除一个程序文件或者模块 (12)
5.5 将本地修改提交到仓库中 (12)
5.6 比较文件 (12)
5.7 查看文件版本的修改历史 (14)
5.8 查看文件的当前状态 (14)
5.9 将某个模块或者文件恢复为旧版本 (15)
6 LINUX下的CVS使用说明 (16)
6.1 创建新模块 (16)
6.2 从CVS 获取新模块 (16)
7 附录 (16)
1CVS的相关概念和术语
Concurrent Version System(CVS,并发版本系统)是用于多用户并行开发的版本控制工具,它的最大特点是使用了“copy-modify-merge”机制而不是“lock-modify-unlock”,在这一点上和VSS有所区别,通过使用CVS生成一个存储文件的仓库(repository),存储在仓库中的每个目录叫做模块(module),在修改时将相应的模块检出到工作目录中(working directory)生成对应的目录,所有的修改都在工作目录中完成,修改完成后再提交到仓库中生成新的版本号,并加以保存。
●repository 仓库:是项目组各种代码存放的地方
●module 模块:是一组相关程序的集合,例如我们系统中97vclib可能作为一个模
块,order也可以作为一个模块
●Checkout 检出:一般用于描述从仓库中将一个整个模块的首次导出。
●Commit 提交:将你的修改提交到库中,这里的提交有点类似于数据库里的提交事
务
●Export 输出:指从库中将一个模块全部导出,类似于Checkout,但使用该命令
没有任何CVS 管理文件,输出的模块没有CVS 控制。
●Import 输入:通常指通过提交一整个目录结构创建一个新的模块的过程,在
Import时,并没有将该目录处于CVS的控制之下
●Release 发行版本:整个产品的版本
●Revision 修订版:单个文件的版本
●Tag 标签:在一个开发的特定期对一个文件集给定的符号名
●Update 更新:从库中取出其他人的修改。只更新本地的拷贝。
2使用CVS工作的流程
2.1 开始阶段
在使用CVS进行管理的开始阶段,必须由管理人员CVS进行安装并进行相关配置,然后将要管理的程序模块import 到cvs仓库中,注意这里要清除程序中相关的不必要的文件(如编译生成的临时文件,执行文件等),另外在import后该程序模块并没有处于CVS的控制之下,必须再使用checkout命令检出。
管理人员在将程序模块导入到数据库后,其他的开发人员通过checkout 将程序导出到自己的开发环境中,流程如图2.1:
图2.1
2.2 软件开发过程中
在软件开发过程中,对于程序开发人员主要有以下的工作要做:
●修改的相关程序和模块
●删除程序和模块
●增加程序和模块
对于以上动作,都有相应的CVS管理流程,具体如下。
2.2.1修改相关程序和模块
1)在修改前
必须从仓库中获取最新的要修改的代码(用cvs update命令),如果对于cvs服务端设置为“Checkout read-only”方式的,你还要告诉CVS系统给你要修改的文件打上可修改标志(通过cvs edit命令)
2)修改后
在文件修改后为了防止在你修改过程中又有其他人员也修改了同样的文件你必须再次从仓库中更新你的代码(update),如别人也修改了相同文件,系统将自动合并,如有修改冲突,也将有提示(这里将手工解决),然后将整理好的程序提交到仓库中。具体的流程见图2.2:
图2.2
2.2.2删除相关程序和模块
过程如下:
1. 通过CVS命令删除你要删除的模块或文件
2. 通过提交命令使删除生效
这样其他人在update这部分程序时,被删除的程序在本地拷贝中就被删除。
注:这里删除在CVS仓库中没有物理删除,假如你获取该模块的老的版本,还可以获取你删除的模块或者文件
2.2.3新增相关程序和模块
过程如下:
1.通过CVS命令增加你要增加的模块或文件
2.通过提交命令使增加生效
这样其他人在update这部分程序时,被增加的程序就被拷贝到他本地目录中。
2.3 软件发布
在软件程序发布前,程序往往已经经过若干测试,在确认测试的版本已经达到发布的要求,我们将整理程序,打上发布标签,然后进行发布。
3CVS服务端安装
安装环境:
●操作系统:Red Hat Linux 9.0(虚拟机)
●cvs服务端版本:cvs-1.11.2-10 (可从https://www.doczj.com/doc/2415496133.html,下载最新版本)
在安装前确定你有root的权限。
这里主要介绍cvs服务端在Red Hat Linux 9.0(虚拟机)上的安装。我们安装的CVS 版本为cvs-1.11.2-10,安装过程如下:
1)首先确保系统安装有cvs,Redhat9.0缺省是装了的:
# rpm -qa|grep cvs
cvs-1.11.2-10
如果命令输出类似于上面的输出则说明系统已经安装有cvs,否则就需要从安装光盘中安装cvs的rpm包或者到https://www.doczj.com/doc/2415496133.html,去下载并安装rpm包.。
2)建立cvs用户组,便于管理cvs用户
#groupadd cvs
3)建立cvs组的cvsroot用户和所属的目录
#useradd -g cvs -G cvs -d/cvs cvsroot
4)为cvsroot用户添加密码
#passwd cvsroot
5)改变/cvs的目录属性
#chmod 775 /cvs
6)初始化cvs源码库,此操作生成目录/cvs/CVSROOT,其下为一些初始化文件
#cvs -d/cvs init
7)创建可以登陆cvs服务的用户及密码,需要创建文件passwd
#vi /home/cvsroot/CVSROOT/passwd
文件内容如下:
weiqiong:xxxxxx:cvsroot
chenxu:xxxxxx:cvsroot
此文件的意思是weiqiong和chenxu两个用户可以登陆cvs服务器,登陆后其权限为用户cvsroot的权限。
注意:cvs用户和服务器用户是可以不一样的
8)xxxxxx为密码,
可以写一段perl脚本来生成加密的密码。
如:在/cvs路径下
vi passwd.pl
输入文件的内容:
#!/usr/bin/perl
srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $plaintext = shift; my $crypttext = crypt ($plaintext, $salt);
print "${crypttext}";
保存该脚本
最后chmod a+x /cvsroot/passwd.pl
如果你想生成一个密码是“123456”,则输入:
#./passwd.pl "123456"
回车即可得到加密密码,用其替换passwd文件中的xxxxxx
9)加入cvs服务(这里的端口2401也可以配成其他的,使用的是redhat9.0缺省就有cvs
服务,这一步可以省略)
#vi /etc/services
cvspserver 2401/tcp #pserver cvs service
cvspserver 2401/udp #pserver cvs service
10)cvs服务由xinetd唤起的,所以在xinetd.d目录下添加需要启动的服务:
#cd /etc/xinetd.d
#vi cvspserver
文件内容:
service cvspserver
{
flags = REUSE
socket_type = stream
wait = no
user = root
protocol = tcp
server = /usr/bin/cvs
server_args = -f --allow-root=/cvs pserver
disable = no
}
11)重新启动xinetd:
#/etc/rc.d/init.d/xinetd restart
12)检查cvspserver服务是否已经启动
#netstat -l |grep cvspserver
结果如下:
tcp 0 0 *:cvspserver *:* LISTEN
这样服务器就设置完成了,我们接着搞定客户端。
4CVS客户端安装
4.1 在UNIX环境中安装CVS客户端
cvs在Unix下的安装比较简单,登陆cvs仓库的用户必须属于刚才配置的cvs组,我们用cvsroot用户登陆,用命令:
#su cvsroot
$cvs -d :pserver:XXXX@10.61.11.222:2401/cvs login
XXXX是指CVS服务器分配的用户名,这样就可以登陆cvs仓库了。
为了方便,我们可以在当前用户的~/.bash_profile文件中增加如下设置:
export CVSROOT=:pserver:XXXX@10.61.11.222:/cvs
然后直接用cvs login ,输入密码后就可以登陆到cvs仓库了。
4.2 在Windows环境中安装客户端
安装环境说明:
操作系统:WindowsXP
wincvs版本:1.3.13.1
安装以下程序:
●Python-2.2.3.exe (https://www.doczj.com/doc/2415496133.html,)
●tcl832.exe (https://www.doczj.com/doc/2415496133.html,)
●WinCvs13b13.exe (https://www.doczj.com/doc/2415496133.html,)
安装好cvs后,就需要配置Wincvs环境了。
从开始菜单中打开wincvs(开始菜单->程序-> Wincvs->Wincvs),配置步骤如下:
●点击菜单Admin->preferences,在弹出的窗口中设置如图4.1:
图4.1
说明:
1.authentication 是指登陆验证方式,这里选pserver及CVS的口令认证方式
2.path 是指仓库的路径,“2401”是服务端给客户端配的端口,这里是默认的,也
可以配成其他端口。/cvs 是cvs配置的仓库
3.host address 是cvs服务器地址这里是10.61.11.222
https://www.doczj.com/doc/2415496133.html,er name :是登陆cvs仓库的用户名,冒号后面是登录时候的密码,如果这边不设
置,登录时候会自动提示输入密码。
●点击Globals标签,注意其中"checkout read-only"和"prune(remove)empty directories"
两个选项,分别表示“检出时文件只读”和“自动删掉空目录”。见图4.2:
图4.2
●设置存放口令和代码项目的目录(第一次登录输入口令保存后,下次登录就不需要再输
入了),见图4.3
图4.3
●配置文本文件的比较工具,wincvs有自带的文本文件比较方法,但感觉不是很直观,
用起来很不爽,但wincvs可以支持第三方的比较工具,如WinMerge,Beyond Compare,Araxis Merge和Compare It等,经过比较发现WinMerge工具很不错,那么我们可以先安装该工具并配置CVS使用它,见图4.4,我们可以在External Diff Program 前打勾,并在后面的编辑框中输入“C:\Program Files\GNU\WinCvs 1.3\WinMerge.exe”,事先拷贝该程序到此目录下。
图4.4
●登陆CVS仓库
配置完后,应该登录以使服务端记住你的登录名和密码。
点击菜单Admin->Login,如果上面没有设置明文密码,则输入口令即可,如图4.5。
图4.5
这样WinCVS安装和配置已经完成,下面讲述CVS的使用方法。
5WINCVS使用说明
5.1 从CVS 获取新模块
对于第一次获取模块,如在本地机器上还没有相关代码,我们可能首先要检出相关模块,从库中检出一个模块,会在本地创建构成模块的目录层,过程如下:
1. 选择Remote->Checkout module 菜单。
2. 在弹出的checkout settings对话框中,在Module name and path...模块名输入框内,输入模块名。注意模块名区分大小写,并且应该已经存在于CVS仓库中(如果不清楚,可问项目组长),并在Local folder to checkout to输入模块要存放的目录。一个名为模块名的目录将会创建在你选择的目录下,如图
3.1所示。
3. 选择该页面的Globals 框,设置检出的只读项为Checkout read-only ,这个选项可以不选,否则checkout出来的源代码将默认不允许用户进行修改的,如图5.2。
4. 点击确定按钮。
例如项目经理告诉仓库中已经建立了一个SDK-pc的模块,要求小组各成员获取,作为小组成员的我准备将该模块获取到d:\Downcode目录中。
图5.1
图5.2
这样在我计算机的D:\Downcode就存在受cvs控制的项目代码目录了,如图5.3:
图5.3
5.2 在程序开发过程中,从CVS同步别人的修改
在程序开发过程中,为了修改的同步,你也许要求将别人修改的合并到你本地使用的拷贝中,从服务端将修改取到本地的过程称为更新。可以更新单个文件、被选中的文件集,或者一整个目录层。例如,别人做了SDK-pc/src目录修改,我可能要做一次更新(将别人的修改和你的修改合并),那么在该模块上右击,选择“update selection”菜单,就会将代码更新到你机器上,见图5.4
图5.4
5.3 增加一个程序文件或者模块
如果在程序开发过程中,你增加了几个程序文件或者目录,那么你要将增加的内容增加到CVS仓库中,例如我在SDK-pc目录下增加了new1.cpp和new1.h两个文件,那么可以选择要增加的这两个文件,执行Modify->Add selection菜单,将增加的文件加到仓库里,做完这一步后被增加的文件变成红色,是因为没有提交的缘故,因此增加后千万别忘了做提交操作,方法是选择Modify->commit菜单,如图5.5:
图5.5
5.4 删除一个程序文件或者模块
在程序开发过程中,我们可能要删除一些废弃的文件或目录,例如现在要删除SDK-pc 目录中new1.cpp和new1.h两个文件,删除有两种方式:
1)仅从本地删除,删除的方法是选择要删除的文件,然后执行Modify->erase selection 菜单,也可以直接到此目录下删除该文件,此方法主要是用来得到服务器的“干净”版本。
2)从本地和服务器端都删除该文件,删除的方法是选择要删除的文件,然后执行Modify->Remove菜单。在完成这一步后千万别忘了做提交操作,方法选择Modify->commit 菜单,如图5.6所示。
图5.6
5.5 将本地修改提交到仓库中
你可以提交一个文件或是一个目录及其子目录中的所有文件。被修改的文件由它们旁边的一个红色文档图标标记出来。
选中想要提交的那个文件或文件夹,然后从Modify菜单中选择“Commit”。
5.6 比较文件
有时我们可能想知道文件做了哪些修改,在检入之前你可能想看一下所做的修改,或者同一文件各版本之间有哪些不同,在wincvs提供了这样的功能,操作如下:
本地修改和仓库中的文件的比较:
选择你本地已经修改的文件,右击菜单选择Deff selectiong,在下面的输出窗口将显示本地修改文件和服务器文件之间的不同,见图5.7
图5.7
程序的不同版本之间的比较
例如比较某个文件的1.2版本和1.3版本,则选择某个文件右击选择Diff selection 菜单
填入如下内容,如图5.8:
图5.8
如果已经安装了专门的比较工具,并且已经做了配置(见4.2.1节),图5.8中选中
”Use the exeternal diff program”我们可以见到如下效果,见图5.9:
图5.9
5.7 查看文件版本的修改历史
点击某个文件,执行Query->Graph Selection …菜单,会出现图5.10:
图5.10
5.8 查看文件的当前状态
我们有时要查看某些文件的当前状态,以决定是否对其进行改动,过程如下:
点击某个文件,执行Query->Status菜单或右键Status selection选项,会出现图5.11:
图5.11
5.9 将某个模块或者文件恢复为旧版本
我们可能经常遇到这样的问题,在软件发布后发现程序有重大的BUG,立即修改可能时间不允许,因此我们可能要将其恢复到上一个稳定的版本,例如我们将SDK-pc项目的根目录xcfg-debug.sh文件恢复到1.2版本,在wincvs中使用方法如下:
1)在wincvs中点击xcfg-debug.sh文件
2)选择菜单Modify -> update selection
3)在弹出的界面中选择“Update options”页
4)在选择框Retrieve rev./tag/bran前打勾,并在编辑框中填入1.2,如图5.12所示
5)然后按确认按钮,这时你会发现你机器上的xcfg-debug.sh文件已经变成1.2的版本
图5.12
6LINUX下的CVS使用说明
6.1 创建新模块
Linux和在wincvs中一样,如果你要将某个模块用CVS管理起来,你就需要创建一个单独的目录,并把所有要使用的文件做一个有效的组织(注意要暂时移走其中不需要的文件,在导入后再移回来)。过程如下:
登陆Linux的cvsroot帐户并设置CVSROOT变量,如(4.1)节中讲解。
假如当前目录下有个SDK-Qtopia-pc目录要求导入到仓库中,则输入:
$ cvs import –m “SDK-pc first import” SDK-pc ZTE VER1_0
“-m”后面跟的是注释,是对当前导入文件的说明
SDK-pc 是我们导入的模块名和目录
ZTE 是开发商名称
VER1_0 表示版本标识
注意,使用import命令会把SDK-Qtopia-pc目录下的所有文件和目录(包括子目录)引入到文件仓库中指定模块下,但该目录中的文件和子目录并不在cvs的控制之下,必须用cvs checkout 方法导出新的模块。
6.2 从CVS 获取新模块
Linux中cvs获取新模块用cvs checkout 命令,语法如下:
cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules
-r 检出指定版本的模块
-D 检出指定日期的模块
-d 检出指定目录而不是模块
-j 合并当前版本和指定版本
使用下面的命令会检出刚才导入的模块,并在当前目录下生成与文件仓库中完全一样的目录结构:
$ cvs checkout SDK-pc
也可以导出模块中的某个目录:
$ cvs co SDK-pc /src
注意:很多cvs命令都有缩写形式:commit=>ci; update=>up; checkout=>co/get; remove=>rm 7附录
CVS命令行C V S的开放标准