搭建CVS服务器和CVS客户端

本文为飘扬原创,首发飘扬博客,http://piaoyang.org,作者邮箱piaoyang168#163.com,请尊重版权,转载请保留本行说明。

在Linux和Windows下搭建CVS服务器与CVS客户端的详细配置指南

============================================
时间:2007-04-12
作者:飘扬
首发:飘扬博客
网址:http://piaoyang.org
Q Q: 47720194
邮箱:piaoyang168#163.com
版权声明:可以任意转载,转载时请务必标明原始出处和作者信息

摘要:本教程包含CVS的入门知识讲解、在linux和windows下CVS服务器与CVS客户端的配置指南,详细介绍了配置过程,可以说是一篇组建CVS开发环境
的入门、学习与提高的完美教程。通过本教程你可以在最短的时间里面最快的搭建好CVS服务器与CVS客户端的的开发环境。如有不明之处,请联系飘扬,你可以到我的博客
(飘扬博客)http://www.piaoyang.org 给我留言或QQ47720194,我会尽力解答你的问题。


目录:
一、CVS入门知识详解
1、什么是 CVS?
2、CVS基本概念
二、Linux下CVS服务器与客户端的配置
1、Linux下CVS服务器的配置
2、Linux下CVS客户端的配置
三、Windows下CVS服务器与客户端的配置
1、windows下CVS服务器的配置
2、windows下CVS客户端的配置
四、结束语


一、CVS入门知识详解

1、什么是 CVS?

CVS 是一种客户机/服务器系统,类似于microsoft SourceSafe,可以让开发人员将他们的项目存储在称为资源库的中央位置。使用 cvs
客户机工具,开发人员可以对资源库的内容进行更改。CVS 资源库会依次记录对每个文件所做的每个更改,并创建一个完整的项目开发进展历史。开发人员可以请求特定源文
件的旧版本、查看更改日志,并根据需要执行其它一些有用的任务。所有重要的免费软件项目都使用 CVS
作为其程序员之间的中心点,以便能够综合各程序员的改进和更改。这些项目包括: Gnome, KDE, The GIMP, Wine, 等等。

CVS 的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序.这样,就好象只有一个人在修改
文件一样.避免了冲突.每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由
cvs 仓库管理员统一 修改.这样就可以做到跟踪文件变化,冲突控制等等.

CVS可以协助一组人共同开发一个工程。如果你是一个项目中的一组成员之一,CVS也能够帮助你。除非你特别仔细,你很容易覆盖其他人的工作。一些编辑器,例如GNU
Emacs,试图去判定一个文件是否被两人同时修改。不幸的是,如果一个人使用其它的编辑器时,这个安全方式将不再有效。CVS使用让不同开发者独立工作的方式解决了
这个问题。每一个开发者的工作都在他自己的目录内,并且CVS将 在每个开发者的工作完成后进行合并工作。

由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分。不过大多数CVS
软件都把它们合二为一了。我们这里就分别从服务器和客户端的角度讨论cvs的使用。

2、CVS基本概念

Repository(仓库)
CVS的仓库存储全部的版本控制下的文件copy,通常不容许直接访问,只能通过cvs命令,获得一份本地copy,改动后再check in(commit)回仓库
。而仓库通常为与工作目录分离的。CVS通过多种方式访问仓库。每种方法有不同目录表示形式。数据如何存放在repository中:随着CVS版本的不同,存放结构
会发生变化,一般情况下用户无需了解数据到底是如何存放的。

Revision(修订版)
每一个file的各个revision都不相同,形如1.1,
1.2.1,一般1.1是该文件的第一个revision,后面的一个将自动增加最右面的一个整数,比如1.2, 1.3, 1.4…有时候会出现1.3.2.2,原
因见后。revision总是偶数个数字。一般情况下将revision看作时CVS自己内部的一个编号,而tag则可以标志用户的特定信息。

Tag(标签)
用符号化的表示方法标志文件特定revision的信息。通常不需要对某一个孤立的文件作tag,而是对所有文件同时作一个tag,以后用户可以仅向特定tag的文件
提交或者checkout。另外一个作用是在发布软件的时候表示哪些文件及其哪个版本是可用的;各文件不同revision可以包括在一个tag中。如果命名一个已存
在的tag默认将不会覆盖原来的;

Branch(分支)
当用户修改一个branch时不会对另外的branch产生任何影响。可以在适当的时候通过合并的方法将两个版本合起来;branch总是在当前revision后面
加上一个偶数整数(从2开始,到0结束),所以branch总是奇数个数字,比如1.2后面branch为1.2.2,该分支下revision可能为1.2.2.1
,1.2.2.2,…

Conflict(冲突)
完全是纯文本的冲突,不包含逻辑上的矛盾,比如CVS不能解决如下问题:某人修改了函数f的参数,而另外一个人在另外一个地方用老的参数调用该函数。文本冲突需要用户
自己参与解决,CVS无法自动解决。(如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)http://www.piaoyang.org
给我留言或QQ47720194,我会尽力解答你的问题。)

Module(模块):CVS服务器根目录下的第一级子目录。通常用于存放一个项目的所有文件
Check out(检出):通常指将仓库中的一整个模块首次导出到本地。
Check in(导入)::通常指通过提交整个目录结构并创建一个新的模块。
Release(发行版本):整个产品的版本
Update(更新):从模块中下载其他人的修改过的文件。更新本地的拷贝。
Commit(提交):将自己修改过的文件提交到模块中。

二、Linux下CVS服务器与客户端的配置与使用

1、Linux下CVS服务器的配置
在RedHat Linux
7.1之后的版本上,都有自动安装CVS服务器软件,只要对该软件进行设置,即可使用。此次配置我用的是虚拟机VMware环境下的linux
redhat9.0,下面是具体的配置过程。

1.1 创建cvs组并加入用户
在root权限下,创建一个cvs组并加入成员

  1. 创建组:groupadd cvs
  2. 打开/etc/group文件,找到该组,如cvs❌514:,在后面添加要加入的用户,比如piaoyang,chen等,以逗号隔开,编辑结果是:cv
    s❌514:piaoyang, chen
    只有加入这个组中的成员才能进行相关CVS操作。保存该文件。

1.2 创建一个仓库
假定将CVSROOT指向/usr/local(也可以指向别的目录),用root登录。

  1. 创建cvsroot目录:mkdir /usr/local/cvsroot
  2. 设置该目录的模式:chmod 1777 /usr/local/cvsroot
  3. 修改环境变量:export CVSROOT= /usr/local/cvsroot
  4. cvs init 这样就创建了 CVSROOT。
  5. 更新环境变量:
    #source /etc/profile
    此时系统已经认识$CVSROOT这样的环境变量

1.3 装入源代码

  1. 进入代码所在目录:cd [sourcedir],如cd test
  2. 装载cvs import -m “[repository test]” [cvstest] [vendortag] [releasetag]
    -m后面引号内填入log内容,接下来是源代码模块名称,接着是装载者,最后是标识符号,
    例如:cvs import –m “cvs test” cvstest piaoyang start
    cvs组中的用户也可以创建仓库,但必须有写权限,该权限的设置在下面将会提到。(如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)http://www.
    piaoyang.org给我留言或QQ47720194,我会尽力解答你的问题。)

1.4 设置权限
cvs初始化结束以后,在管理员用户(这里是cvs用户)的主目录/usr/local/cvsroot/下有一个 CVSROOT
目录,这个目录里有三个配置文件:readers,writers, passwd。我们可以通过设置这三个文件来配置 CVS
服务器用户的权限,下面分别介绍这几个文件的作用:
readers文件:此文件中的用户允许对模块进行读取,不允许写入;
writers文件:此文件中的用户允许对模块进行读取和写入;
passwd文件:此文件存储用户名和密码,当用户登录时进行验证;

  1. readers和writers的格式如下,每个用户占据一行:
    aaa
    bbb
    ccc
  2. passwd文件的格式如下,每个用户占据一行:
1
2
3
[cvs 用户名]:[加密的口令]:[等效系统用户名]  
如: piaoyang:$1$rPVPciBw$IK3fb4jO7hQbPXFjK3ee..:piaoyang
其中"piaoyang:$1$rPVPciBw$IK3fb4jO7hQbPXFjK3ee..:"从/etc/shadow中拷贝过来。
  1. 上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来说明吧。假设我们有下面几个用户需要使用 cvs:
    laser,gumpwu,henry,betty,anonymous
    其中 laser 和 gumpwu 是系统用户,而henry, betty, anonymous 我们都不想给系统用户权限,并且 betty 和
    anonymous 都是只读用户,而且 anonymous 更是连口令都没有。
    然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行:
1
2
3
laser:$xxefajfka;faffa33:cvspub gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub betty:fjkal;ffjieinfn/:cvspub anonymous::cvspub

注意:上面的第二个字段(分隔符为
:)是密文口令,从/etc/shadow中拷贝过来即可(此方法适合cvs用户较少的情况,如果用户过多,则需要自己用程序生成密码了)。
编辑 readers 文件,加入下面几行:
anonymous
betty
编辑 writer 文件,加入下面几行:
laser
gumpwu
henry
这样就 ok 了,你再用几个用户分别登陆测试,就会发现一切都 ok 了。这里面的原理和说明我想就不多说了,其实很简单,和系统管理用户的概念是一样的。

1.5 设置开机自动运行CVS

  1. 在/etc/xinetd.d目录下生成一个文件cvspserver。输入命令:
    touch cvspserver
    vi cvspserver
    在cvspserver文件里写入如下内容并保存:

CVS : current version contrl system # DEFAULT: services is enable # this

server script was be writed by piaoyang.org # www.piaoyang.org service
cvspserver { socket_type = stream protocol = tcp wait = no user = root server
= /usr/bin/cvs server_args = -f –allow-root=/usr/local/cvsroot pserver
log_on_success +=USERID log_on_failure +=USERID disable = no }

  1. 修改该文件权限:
    chmod 644 cvspserver
    3),到/etc/rc.d/init.d路径下,运行如下指令重新启动xinetd即可:
    ./xinetd restart
  2. 重启后用root登录,察看cvs服务器是否已经运行:
    netstat -l |grep cvspserver
    如果返回tcp 0 0 *:cvspserver : LISTEN,则说明cvs服务器已经运行。

2、Linux下CVS客户端的配置
为了连接到 CVS 资源库,您需要知道称为 “CVSROOT” 的路径。CVSROOT 是一个字符串,就象 URL,它告诉
CVS用户远程资源库在哪里,以及如何连接它。不仅如此,根据 CVS 资源库是本地的还是远程的,以及连接到它的不同方式,CVS 还有许多不同的 CVSROOT
格式。

2.1 连接CVS服务器
当然你必须拥有cvs用户帐号和密码,以及相关权限。在Linux环境下:

  1. 本地 CVSROOT
    export CVSROOT=/usr/local/cvsroot (告诉CVS客户端,存放代码的资源库在什么地方)
    一个实际的例子,在版本管理员将代码库存放在192.168.0.8 的机器上,路径为:
    /usr/local/cvsroot(如果你telnet 到 192.168.0.8 的机器上的时候,此时你就是在本机)
  2. 远程密码服务器 CVSROOT
    export
    CVSROOT=:pserver:[email protected]:/usr/local/cvsroot(注意冒号不能漏掉,句子中间没有空格)
    pserver 是CVS内部的一种传输协议。
    piaoyang 是用户名,
    192.168.0.8 机器的IP或名字(如果有DNS才能用名字)
    /usr/local/cvsroot 是代码库的具体路径
    (注意:如果你不想每次敲这么多枯燥的命令,你可以在你登陆的时候让系统作这些事情,具体的作法是修改你登录的环境变量。现在用piaoyang作为例子,在文件/h
    ome/piaoyang/.bash_profile后面加入
    export CVSROOT=/home/cvsroot 或export
    CVSROOT=:pserver:[email protected]:/home/cvsroot
    并在根目录下运行:. ./.bash_profile)

2.2 登录CVS服务器
cvs login
(Logging in to [email protected])
CVS password:(在此输入密码)

2.3 拷贝相应模块代码并进行开发
如输入: cvs -z5 checkout VPN
此命令告诉 CVS 客户端使用 gzip 压缩级 5 (”-z5″) 在慢速连接上加快传输速度,来检出 (”checkout”)VPN模块。
一旦检出命令完成,将在包含最新源码的当前工作目录中看到 “VPN” 目录。还会注意到每个子目录下都有一个”CVS”目录 — CVS
在这些目录中存储帐户信息,可以放心地忽略它们。一旦检出结束,用户就无需担心是否设置了 CVSROOT 环境变量,也无需再在命令行上指定它,因为现在所有额外的
“CVS” 目录里都有它的缓存。
记住:只需要为初始登录和检出设置 CVSROOT。至此你就可以在刚才check out的VPN模块上进行修改或开发了。(如还有不明之处,请联系飘扬,你可以到
我的博客(飘扬博客)http://www.piaoyang.org给我留言或QQ47720194,我会尽力解答你的问题。)

三、Windows下CVS服务器与客户端的配置

1、windows下CVS服务器的配置
在此,我们以WinCVS为例来介绍。WinCVS顾名思义,是用在windows上的,它是一款相当不错的基于Windows的CVS客户端软件。安装时没有什么特
别的地方,与普通的Windows软件相同,一路next就OK了。(最新的WinCVS可以从http://sourceforge.net/project/sh
owfiles.php?group_id=10072地址下载到,也可以在http://sourceforge.net/project
上下载到最新的或其它版本的WinCVS。)由于是软件界面配置,所以针对界面选项填入相应的参数即可,在此不再赘述。

2、windows下CVS客户端的配置
同样我们以WinCVS为例来介绍。安装这个WinCVS不用再啰嗦一遍了吧,跳过,来看配置过程!

2.1 配置WinCVS
选择Admin->Preferences…,在出现的界面上进行一般选项的设置:

  1. Authentication:用来配置cvs服务器的认证方式,可以从下拉框中选择其它的认证方式,不过一般只要选择默认的pserver方式就可以,要注意
    的是必须与cvs服务器配置时所指定的认证方式一致;
  2. Path:用来配置cvs在服务器上的主目录路径,也就是服务器上用进行cvs初始化的目录,如:/home/cvsroot;
  3. Host Address:用来配置cvs服务器所在服务器的地址,可以是IP地址,也可以是DNS名,如:10.104.1.204;
  4. User name:用来配置要使用些WinCVS来登录CVS服务器的用户名,如:cvsyxwu,用户的登录必须由管理员把其添加cvs用户组中;
  5. CVSROOT:此项一般都不需要用户进行修改,用户在输入上边的几个选项时,系统将自动根据用户的输入生成此项的相应内容。
    6)在上一个界面上选择“Globals” ,进行全局选项的设置,此项的配置主要是要注意这几选项:
    第一,Checkout read-only不要选上,否则,checkout出来的源代码将不允许用户进行修改,并且此选项默认是选中的;
    第二,Prune (remove) empty directories也不要选上,否则,会自动删除空目录;
    第三,对一般配置没有特殊要求的,把Dirty files support、Supply control when adding与TCP/IP
    compression选项选中;

2.2 登录WinCVS服务器
选择Admin->login,将出现如下对话框要求用户输入登录口令。输入口令后,选择“OK”按钮,如果CVS服务器与WinCVS的配置都没出错的话,将在CV
S的状态栏中提示:
cvs -z9 -d :pserver:[email protected]:/home/cvsroot login
Logging in to :pserver:[email protected]:2401/home/cvsroot
***** CVS exited normally with code 0 *****
code 0表示正确的登录;而如果出错的话,将是code 1,那么要根据错误的提示进行相应的修改。

2.3拷贝相应模块代码并进行开发

  1. 在workspace中的Modules选中要存放checkout模块的目录;
  2. 选择Create->Checkout Modeles,将出现一个对话框,需要进行选择。其中,Module name and path on the
    server就是要存放checkout 内容的目录,由用户输入;而Local folder to checkout to就是第一种用户所选择的目录。
  3. 至此你就可以在刚才check out的代码上进行修改或开发了。

四、结束语
如果你是通篇读到这里,那么到这里,你基本上已经能为自己或公司配置一个实用的CVS服务器与CVS客户端了,无论是在Linux下,还是在Windows下。谢谢你
的耐心与信任,同时也对你的小有成就小小的祝贺一下。在最后飘扬要申明的是,本教程里的大部分内容是由网上多篇介绍CVS的文章提取而来,飘扬只是用自己的逻辑和语言
将这些内容串联起来。在此,飘扬对这些文章的原作者深表感谢。如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)http://www.piaoyang.o
rg 给我留言或QQ47720194,我会尽力解答你的问题。以此拙作,希望能给大家带去些微的帮助。

本文为飘扬原创,首发飘扬博客,http://piaoyang.org,作者邮箱piaoyang168#163.com,请尊重版权,转载请保留本行说明。