1、 验证是否已安装CVS
#rpm -q cvs
如果能显示出类似这样的版本信息,证明已安装CVS:
#cvs-1.11.19
若没有安装信息,则需要从htttp://www.cvshome.org 下载相应的安装包
我的安装环境是 linux as4 u2
若不想使用自带版本,可以用
#rpm–e cvs
删除自系统自带的cvs 安装包
从htttp://www.cvshome.org获取最新的安装包cvs-1.11.21.tar.gz
解压该包并安装:
# tar zxvf cvs-1.11.21.tar.gz
进入解压包 cvs-1.11.21
# ./configure–prefix =你的安装目录 &&make &&make install
2、 创建CVS用户组与用户
root用户下执行以下命令:
#groupaddcvs //对比cvsnt:此处生成的是一个linux的系统用户组(因为Linux下的CVSROOT中不支持group文件),记录在系统文件/etc/group中; 而cvsnt里的group文件是专门为cvs建立组的,与pc系统的组是不相干的。
#addusercvsroot //对比cvsnt:此处生成的是一个linux系统用户cvsroot, 记录在系统文件/etc/passwd中。
#passwd cvsroot
#输入cvsroot用户密码
3、创建一个目录作为cvs库
root用户下执行:
#mkdir /cvsroot //此处可改为你想要的cvs库的路径,如想在/home目录下mkdir一个目录作为库,则改命令为:#mkdir /home/cvsroot。
#chowncvsroot.cvs/cvsroot //将即将成为库的目录/cvsroot的拥有者改为用户cvsroot
4、初始化CVS仓库 (自动生成CVSROOT)
需要在cvsroot用户下执行
#su - cvsroot
#cvs -d/cvsrootinit //初始化后,目录/cvsroot正是成为一个cvs库,其下自动生成了一个子目录CVSROOT,用于存放库的配置文件。 后面对/etc/xinetd.d/cvspserver文件的配置要与这里对应,即要注意库的根目录必需与这里的一致(即为/cvsroot)。
5、修改环境变量CVSROOT
编辑/etc/profile或者/home下相应用户的.profile文件
此处以修改/etc/profile为例:
#exit
退回到root用户,只有root用户才有权限修改/etc/profile
#vi /etc/profile 编辑/etc/profile文件
在末尾加上以下两句:
CVSROOT=/cvsroot //将环境变量CVSROOT的值设置为库的根目录/cvsroot
export CVSROOT //使用export使环境变量CVSROOT生效
也可以直接用命令:
$ export CVSROOT=/cvsroot
更新环境变量:
#source /etc/profile
此时系统已经认识$CVSROOT这样的环境变量
6、加入&启动cvs服务:
一般的redhat上缺省就有cvs服务,所以不用加。可以先查看/etc/services文件,没有的话,就编辑它:
vi /etc/services
在末尾加入两行内容:
cvspserver 2401/tcp #pserver cvs service
cvspserver 2401/udp #pserver cvs service
在系统中加入了cvs服务后,接下来就要启动它了
一般cvs服务由inted或者xinetd来唤起,因此需要修改inetd或者xinetd提供的服务。
#vi /etc/init.d/inet.conf
在其中加入以下内容:
cvspserver 2401 stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/cvsroot pserver
# default: on
# descrīption: The cvs server sessions;
service cvspserver
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
// /usr/bin/cvs是cvs命令文件的位置。若删除了系统自带的cvs安装包,则server=你的cvs安装目录/bin/cvs
server_args = -f --allow-root=/cvsrootpserver
//对应第4步cvs -d/cvsrootinit命令
only_from = 192.168.10.0/24
// 24是子网掩码的长度,对应255.255.255.0。only_from是用来限制访问的,可以根据实际情况不要或者修改。
}
启动CVS服务后,要修改该cvspserver文件的权限,以防别的用户乱改:
# chmod 644 cvspserver
然后重新启动xinetd:
# /etc/rc.d/init.d/xinetd restart
然后察看cvs服务器是否已经运行:
# netstat -lnp|grep 2401
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN xxxxxx/xinetd
则说明cvs服务器已经运行。
7、建立cvs用户
为了CVS系统的安全,我们要修改/cvsroot/CVSROOT/config文件,将"#SystemAuth =no"的前而的注释号#去掉,即改为“SystemAuth =no”,然后给开发者们逐一建立账号,新建的不要分配用户目录,因为它将作为一个虚拟用户帐号来使用,具体命令如:
以下,对应cvsnt:创建CVSROOT目录下的passwd文档:
------------------------------------------------------------------
[root@terry root]# chmod -R ug+rwx /cvsroot //修改库的访问权限:对属主及属主的组开放rwx权限
[root@terry root]# chmod 644 /cvsroot/CVSROOT/config //库的配置文件config只能被属主修改
以下,对应cvsnt:添加一个名为gaoshang的用户到passwd文件中。
比起在cvsnt,在linux下的这个添加过程要麻烦多了!
--------------------------------------------------
[root@terry root]# useradd -g cvs -M gaoshang //创建这个pc系统用户gaoshang的目的是利用它生成密钥,因为在linux下cvs没有为用户加密的功能,不像cvsnt可以直接用命令passwd -a就可以生成一个用户与密钥了。
[root@terry root]# passwd gaoshang
上面的命令就创建了一个并没有Home目录的用户gaoshang,接着将系统的shadow文件(shadow文件中记录了系统的用户及其密钥信息)复制到CVSROOT, 并重命名为passwd,操作如下:
[root@terry root]# cp /etc/shadow /cvsroot/CVSROOT/passwd
[root@terry root]# chmod 0644 /cvsroot/CVSROOT/passwd
然后修改passwd文件,将除刚才设定的可使用CVS的用户cvsroot及gaoshang之外的所有行删除,然后去掉每行第二个冒号以后的所有内容,并添上字符串cvsroot, 改为如下格式:
[root@test11 CVSROOT]# more passwd
cvsroot:$h3ntACe9$cM2SADto6B9P5h5Wrbgyi.:cvsroot
gaoshang:ttSJv9AK.zzZhhHLEQZnZPgEe8f1:cvsroot
然后,删除掉刚刚在系统中添加的那个用户gaoshang:
[root@terry root]# userdel -f gaoshang //因为gaoshang这个系统用户只是用来为cvs用户gaoshang的密码生成密钥的,所以,密钥得到后,系统用户gaoshang可以删除了。
---------------------------------------------------
至此,passwd文件已经创建好了,并且已经有两个cvs用户加入其中了:cvsroot与gaoshang,其中cvsroot还是pc系统用户,而gaoshang只是cvs用户,它必须对应到一个系统用户,这里它对应的是cvsroot。
-------------------------------------------------------------------
好了,至此,CVS服务器端已配置完成。这时你的CVS用户就只能用passwd中规定的用户来登陆你的CVS服务器了。
8 .为用户分配权限
对比cvsnt:在cvsnt中,可以用命令cvs chown来修改某个目录的属主,用命令cvs chacl来设置某个cvs用户/组对一个目录的访问权限; 可以在CVSROOT下创建admin文件来设置库的管理员,创建group文件来设立不同的组。
而在linux下,cvs不支持group与admin文件,也不支持cvs chacl命令,所以就只能用系统命令:chown 与 chmod 对pc系统用户的访问权限进行设置,之后,映射到这个系统用户的cvs用户的权限也就跟着改变了(这一点与cvsnt很不一样,在cvsnt中:cvs用户与pc系统用户的权限是不相干的,映射只是为了登陆,而权限不会也跟着映射过来的); 在linux下,cvs还是支持readers、writers文件的,所以也可以通过修改它们来修改用户的权限,不过这个权限是对整个库的访问权限。
在/cvsroot/CVSROOT/下 ,加入两个文件 readers , writers
将只有只读权限的用户加入 readers 文件,
将具有读写权限的用户加入writers 文件。
如:# vi writers
gaoshang
注意:readers文件的优先性高于writers文件的,也就是说,如果将同一个用户都加在这两个文件中,那这个用户只拥有只读权,并不拥有写权。
所以:writers中的用户不能在readers中,要不然不能上传更新文件。
9、linux客户端登录测试 (或见 window cvs客户端 wincvs 1.3的使用说明)
假定cvs服务器在192.168.10.11上,系统上有用户cvsroot和gaoshang。登陆另一台linux机器,执行下列命令可以完成测试:
[root@test2 test]# export CVSROOT=:pserver:[email protected]:2401/cvsroot
[root@test2 test]# cvs login
Logging in to:pserver:[email protected]:2401/cvsroot
CVS password:
#注:输入密码,没有出错提示表示登陆成功。
[root@test2 test]#
[root@test2test]# export CVSROOT=:pserver:[email protected]:2401/cvsroot
[root@test2 test]# cvs login
Logging in to:pserver:[email protected]:2401/cvsroot
CVS password:
#注:输入密码,没有出错提示表示登陆成功。
[root@test2 test]#
配置中碰到的问题
1、cvsroot用户不能登录
[root@test2 test]# export CVSROOT=:pserver:[email protected]:2401/cvsroot
[root@test2 test]# cvs login
Logging in to:pserver:[email protected]:2401/cvsroot
CVS password:
no such user cvsroot in CVSROOT/passwd
解决办法,查看发现原因是/cvsroot/CVSROOT/passwd文件中没有包含cvsroot用户
2、只有cvsroot用户可以登陆,别的用户都不能登录
查看原因发现是/etc/xinetd.d/cvspserver文件的server_args = -f --allow-root=/cvsroot pserver目录参数不对,因为我们此次配置的cvs工作目录是/cvsroot,而不是/home/cvsroot,所以将该参数改为server_args = -f --allow-root=/cvsroot pserver,所有用户均可正常登录
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
groupadd cvsgroup1
useradd -g cvsgroup1 -d /home/cvsroot1 cvsroot1
passwd cvsroot1
chmod -R 750 /home/cvsroot1
以cvsroot1用户登录
export CVSROOT=/home/cvsroot1
cvs init
采用cvs验证方式
将cvsroot1加入到CVSROOT/admin中(这个文件默认没有)
(在admin文件里面的用户,被当做这个Repository的管理员)
export CVSROOT=:pserver: cvsroot1@localhost:/home/cvsroot1
cvs login
cvs passwd -r cvsroot1-a sjc // cvsroot1 为映射到系统的用户,sjc为cvs虚拟用户
cvs passwd -r cvsroot1-a hgb
cvs passwd -r cvsroot1-a cvsadmin1
将管理员改为 cvsadmin1 虚拟用户
将cvsadmin1加入到CVSROOT/admin中(这个文件默认没有)
export CVSROOT=:pserver: cvsadmin1@localhost:/home/cvsroot1
chmod u+w config
将config中的UseSystemUser=no
4、 新加一个项目
由管理员创建用户
groupadd cvsgroup2
useradd -g cvsgroup2 -d /home/cvsroot2 cvsroot2
passwd cvsroot2
chmod -R 750 /home/cvsroot2
由该项目配置管理员操作:(某一个项目用户只能由专一帐号登录)
以cvsroot2用户登录
export CVSROOT=/home/cvsroot2
cvs init
采用cvs验证方式
将cvsroot2加入到CVSROOT/admin中(这个文件默认没有)
(在admin文件里面的用户,被当做这个Repository的管理员)
export CVSROOT=:pserver:cvsroot2@localhost:/home/cvsroot2
cvs login
cvs passwd -r cvsroot2 -a sjc
cvs passwd -r cvsroot2 -a hgb
cvs passwd -r cvsroot2 -a cvsadmin2
将管理员改为 cvsadmin2 虚拟用户
将cvsadmin2加入到CVSROOT/admin中(这个文件默认没有)
export CVSROOT=:pserver:cvsadmin2@localhost:/home/cvsroot2
chmod u+w config
将config中的UseSystemUser=no
5、 客户端软件wincvs
启动wincvs,ctrl +L,弹出命令行模式,输入 cvs passwd 修改密码
~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.创建用户cvs
#useradd cvs
为cvs用户添加密码
#passwd cvs
创建目录来放需要导入的源代码库
#mkdir /home/cvs/cvsroot
修改目录归属
#chown -R cvs:cvs /home/cvs/cvsroot
2.初始化cvs源代码库,此操作生成目录/home/cvsroot/CVSROOT,其下为一些初始化文件
#cvs -d /home/cvs/cvsroot init
也可以将cvsroot目录建在别的地方
#cvs -d /space/cvsroot init
*加入cvs服务(缺省安装的通常缺省就有cvs服务)
#vi /etc/services
#cvspserver 2401/tcp #pserver cvs service
#cvspserver 2401/udp #pserver cvs service
3.把cvs服务放到xinetd系统服务中
#cd /etc/xinetd.d
#vi cvspserver
文件内容:
service cvspserver
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/home/cvs/cvsroot pserver
log_on_failure += USERID
disable = no
}
确认/etc/services文件中,有cvspserver关键词,并分配了端口,如:cvspserver 2401/tcp
重新启动xinetd:
#/etc/rc.d/init.d/xinetd restart
*检查cvspserver服务是否已经启动
#netstat -l |grep cvspserver
应该有如下结果,表明cvs服务器安装成功:
tcp 0 0 *:cvspserver *:* LISTEN
4.登录cvs服务器(如服务器IP是192.168.68.253):
另一台linux机器执行下列命令:
#export CVSROOT=:pserver:[email protected]:2401//space/cvsroot
#cvs login
输入密码,没有出错提示表示登陆成功.
如果想在一个linux系统上建多个源代码库,分别提供cvs服务。重复上面步骤就可以了。
第1步时候要注意使用一个不同路径。
第2步放到xinetd系统服务中稍微麻烦点。/etc/xinetd.d目录下要生成一个新的任务配置文件,
例如cvspserver1,文件中service名称一定要区分第一个,例如service
cvspserver1,server_args做相应变动。还要在/etc/services文件中,加入新的服务端口号,
例如:cvspserver1 2402/tcp。重新启动xinetd服务.
第3步测试时候,可以这样设定:
#export CVSROOT=:pserver:[email protected]:2402/usr/local/source1
客户端需要设置CVSROOT变量,下次登陆cvs的时候不用输入路径
如客户端有用户guo,在/HOME/guo目录的文件.bash_profile中加入:
CVSROOT=:pserver:[email protected]:/home/cvs/cvsroot
export CVSROOT
键入命令使变量设置马上生效:
#source /home/weiqiong/.bash_profile
导入源代码,如果所有的代码都在目录/home/guo/source下
#cd ~/source
#cvs import -m "initial code" test guo start
这样服务器上生成目录/home/cvs/cvsroot/test中为源代码库
~~~~~~~~~~~~~~
第2章 CVS的基本操作
2.1 Unix/Linux环境下的操作说明
(1) 登录CVS Server
%cvs login
CVS password: ******
注: 如果此时提示.cvspass文件不存在,只要手工创建一个即可: %touch .cvspass
(2) 查看帮助
% cvs --help
%cvs –help-options
%cvs –help-commands
(3) 检取源代码(将CVS服务器端的源代码下载到本地。则本地上的内容为服务器端的一个拷贝)
cvs co [-r tagname/revision] filename|directory
例:%cvs co -r aiobs61_dev products/aiobs/aiip
%cvs co [–D “1 Dec 2002”/2002-12-1/”1 Dec 20:22”] file1
(4) 增加文件或目录到CVS 库中
$ cvs add filename|directory
(5) 提交文件
%cvs ci [-r revision] [ -m”add new functions”] [filename]
增加文件后,需要再执行cvs ci命令,才能完成永久提交。
增加目录后,则不需要再另外执行cvs ci 命令了。
(6) 更新当前工作目录中的文件
%cvs update [-d] [filename]
-d: 取出新增加的目录 = cvs co
(7) 查看文件历史记录
%cvs log [filename]
将给出文件的所有修改记录,版本信息,修改人, 修改时间及更改说明等。
(8) 比较文件
%cvs diff filename
cvs diff可以用来比较本地工作目录和server上的文件,也可以用来比较文件的两个版本之间的差异,实现的是按行比较。对二进制文件则无效。
%cvs diff –r aiobs filename
比较本地和另外一个分支上(分支Tag为aiobs)的文件差异
%cvs diff -D 2002-1-3 -r cbs_rm ora.sql
比较某个日期与某个分支下的文件差异
(9) 显示文件的当前状态
$cvs status filename
常见三种状态:Up-to-date, Need-patch, Locally Modified
Up-to-date:表示该文件已经与CVS服务器端的最新版本是一致的
Need-patch:表示该文件的本地版本低于服务器端的最新版本,需要从服务器端下载更新的版本
Locally Modified:表示该文件在本地已经做过修改了,但还没有提交到服务器上
(10) 删除文件------分三步
%rm filename (先从工作目录中删除)
%cvs remove filename (从CVS中删除)
%cvs commit filename (永久删除)
(11) 删除目录
首先将目录中的所有文件从cvs中删除
% cd ..
% cvs update –p
-p: 告诉update从工作目录中删除这些空目录
即删除了目录下的所有文件,则CVS认为该目录已经被删除了
(12) 给产品/模块打tag
相当给产品或者模块做一个标签或快照
cvs rtag tagname products/module
或 cvs tag tagname products/module
以上两个命令功能相似,区别在于rtag直接到CVS服务器端为源代码加Tag,而使用cvs tag命令则需要事先把源代码checkout到本地。
(13) 建立分支
cvs rtag –b tagname products/module
或cvs tag –b tagname products/module
建立分支常用于程序bug的跟踪、修复。执行cvs tag/rtag命令时,如果使用-b参数,则表示该Tag是一个分支Tag,用户使用这个Tag可以对程序进行修改和提交。而如(12)中建立的普通Tag则只能做查询用。
2.2 Windows环境下的操作说明
(1) 运行wincvs程序
第一次运行时,在界面上弹出“wincvs preferences” 对话窗,以后进入时,通过选中菜单Admin--->preferences,可进入wincvs参数配置对话窗), 设置如下:
在general页中设置CVSROOT 为:
:pserver:username@hostname:/root/cvsroot,
username是访问cvs的用户名及其密码,由CVS 管理员提供。
(2) 在图标栏选中“change location”图标(在目录下拉框的右边)改变缺省工作目录为:E:\work
(3) checkout某个module到本地
选中admin--->login,输入PASSWD
选中create--->checkout module....将弹出的对话框,在checkout settings页中, 设置module name 如: products/aiobs63/testcase,设置local folder to checkout to: 为E:\work, 在”checkout options”页中可以设置根据日期(通过选中by date 日期格式为:YYYY-MM-DD Hour:Mins) 或者版本号(通过选中by revision/tag/branch)来checkout module,点击"确定"即可将testcase目录下的全部文件check out出来。
(4) 增加某个已有的module(目录)到CVS服务器中
(5) checkin 某个文件
运行wincvs程序,在右边的文件列表框中,选择需要check in的文件名-点右键- 选择“commit selection"-在commit setting中的”enter the log message”输入修改日志-确认。
(6) checkout某个文件
运行wincvs程序,在右边的文件列表框中,选择需要check out的文件名-点右键- 选择“update selection"-在”stick options”页中可以设置根据日期(通过选中”before date” 日期格式为:YYYY-MM-DD Hour:Mins)或者版本号(通过选中revision/tag/branch)来checkout 文件。
(7) 如何打tag
注意: 为了便于产品管理,公司软件产品的tag都是由Build Master打的。
(8) 如何将本地新文档checkin到CVS
选中新文档,选择modify-add selection,如果是NONCVS FILE(在文件status栏出现), 则会出现警告,此时应选择modify--add selection binary(以二进制方式add)。 然后选择modify-commit selection将文件提交到CVS库中。
(9) CVSlog修改日志
在每次文档修改时,请按照下列内容,记录修改日志
修改主题:
修改章节:
修改人:
修改时间:
这些信息将被写入wincvs的cvslog中