##language:zh
'''同步不同的CVS仓库解决'''

<<TableOfContents>>


= 基础知识 =

本章介绍一些不着边际的基础知识内容。和同步没有直接关系,可以跳过

== CVS Repository结构 ==

一般的CVS Repository中的文件是采用rcs(1)的格式存放的。这类文件的特征是包含一个“,v”的后缀。rcs文件中包含了文件的修改历史、tag信息,以及commit log。CVS Repository中还有一些特殊目录,它们是:

/CVSROOT -> CVS控制文件。在这个目录中的checkoutlist中所列出的文件会被cvs系统自动地checkout,这些文件会控制CVS系统的行为,如tag扩展,触发器等等。

*/Attic -> HEAD分支删除的文件。这里的,v文件是在HEAD中已经被删掉的那些。

=== rcs文件的操作 ===

rcs文件可以通过ci(1)、co(1)、rcs(1)三个命令来直接修改。这三个命令主要用于管理员在发现问题时进行修复。具体用法请参考相应的联机手册。

== CVSup简介 ==

CVSup是一种高效率的CVS代码库同步软件,它可以用于同步CVS代码库,以及从CVS代码库中checkout出代码。在后一种操作方式中,网络上运行的CVSup要比直接使用CVS去完成checkout快数个数量级,而且减少了同步代码时需要向用户开放代码库部分或全部写权限所带来的风险。

=== CVSup的基本概念 ===

 * listfile. CVSup需要使用一个单独的目录来保存额外的元数据。这个目录通常的名字是sup,可以使用prefix=来指定它的位置。
 * supfile. CVSup的配置文件。

== rsync简介 ==

rsync是一种高性能的远程文件同步软件,它可以用来在两台机器或同一台机器的两个目录之间高速地复制文件。

= cvsup同步 =

cvsup是比较方便的CVS同步方式,它提供了两种同步模式:checkout模式和cvs模式。

== cvsup提供的同步模式 ==

=== checkout模式 ===

checkout模式用于将CVS代码库中的某个分支/tag的一份最新的(或指定日期或时刻最新的)副本提取出来,可以用来将CVS中的源代码(或二进制程序)部署到其它机器上。

=== cvs模式 ===

cvs模式则相当于一个改进的rsync程序,可以将CVS代码库本身同步到其它机器上,通过合理使用CVS的branch能力,cvs模式甚至可以将本地修改过代码内容和远程的CVS中的修改放在一起,从而方便大规模的并行开发中开发人员建立自己的fork branch的需要。

== 使用cvsup客户程序 ==

使用cvsup客户程序首先需要建立一个称为supfile的文件,这个文件告诉cvsup去哪里、如何,取得什么样的数据。下面以FreeBSD cvs repository为例介绍如何使用cvsup

=== checkout模式:取出 5-STABLE 的源代码 ===

{{{
*default host=cvsup.freebsdchina.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_5
*default delete use-rel-suffix
*default compress
src-all
ports-all tag=.}}}

上面的supfile指定了:
 * CVSup服务器 --> cvsup.freebsdchina.org
 * List文件的位置 --> /var/db
 * 下载下来的文件放置的位置 --> /usr
 ( release=cvs 不要改它,这是指定cvsup正在从CVS代码库中复制 )
 * 使用的cvs tag/branch --> RELENG_5
 * 删除在CVS中删掉的文件(delete)
 (use-rel-suffix不要改它)
 * 压缩通讯数据
 * 同步src-all这个collection
 * 同步ports-all这个collection,但不要同步RELENG_5而是同步HEAD(记作".")

=== cvs模式:同步整个FreeBSD源代码cvs库 ===

{{{
*default host=cvsup.freebsdchina.org
*default base=/var/db
*default prefix=/home/ncvs
*default release=cvs
*default delete use-rel-suffix
*default compress
src-all
cvs-all
}}}

注意上面没有指定"tag=RELENG_5"。这种情况下,cvsup将同步CVS代码库到本地。

== 使用cvsupd提供CVSup服务 ==

光有客户端是不能完成同步的任务的。要将CVS代码库暴露为cvsup客户程序可以访问的形式,需要使用cvsupd。

=== release文件 ===

这个文件的作用在于告诉系统要同步目录的绝对路径起点。例如:

{{{cvs list=list.cvs prefix=/home/ncvs}}}

这表示准备发布list.cvs所描述的文件,而绝对路径的起点则是/home/ncvs。

=== list.cvs文件 ===

这个文件的作用在于告诉系统要同步哪个目录。例如:

{{{upgrade src}}}

这里src是从/home/ncvs算起的。一般而言,推荐使用相对路径,这样客户端就不需要也建立/home/ncvs的文件夹,他们可以在/usr中checkout目录并形成/usr/src。

另一种常用的写法是:

{{{upgrade *}}}

这表示同步release文件所描述的目录下的所有内容。

=== 如何放置release和list.cvs文件 ===

需要创建下面的目录结构:

/usr/home/cvsup/base/sup

然后在这个目录中建立叫src-all的目录,这个目录的名字就是前面我们在客户端指定的名字。

此目录称作'''collection'''; 每个类似目录应该有 release和list.cvs 声明文件

在不重新启动cvsup的情况下可以继续创建其他collection目录。


<<Include(RcngForCvsup)>>
= rsync同步 =

rsync同步主要是要配置rsyncd.conf。典型的rsyncd.conf如下:

{{{pid file = /var/run/rsyncd.pid
uid = nobody
gid = nobody
use chroot = yes
max connections = 4

[cvs]
        path = /cvs/root
        comment = whole CVS tree (requires ip authentication)
        hosts allow = 192.168.241.62
}}}

上面,uid, gid应指定为拥有读取相应文件权限的用户和组,基于安全考虑,这个身份应该拥有尽可能少(也就是恰好够用)的权限,use chroot是一定要做的,它保证了即使rsync被攻破,也只能阅读path的目录。

{{{[cvs]}}}是rsyncd collection的名字。里面设置了同步的起点(/cvs/root),以及允许读取这个collection的主机。采用IP验证适合于局域网。

`man rc.subr` 可以获得进一步的 RCng 制作说明……

== 安装rsync ==

在FreeBSD中安装rsync非常简单。

cd /usr/ports/net/rsync && make all install clean

== 启动rsyncd服务 ==

要正确使用rsync,至少有一端要启动rsync服务。一般来说,推荐使用ssh验证方式,这种方式通常使用key进行身份验证,并加密全部通讯(类似key验证的cvs服务),而且不要求一直开启daemon(在需要的时候会通过shell启动)。

另一种常见的是daemon方式。方法是修改/etc/rc.conf.local,加入:

{{{rsyncd_enable="YES"}}}

修改/usr/local/etc/rsync.conf,然后执行:/usr/local/etc/rc.d/rsyncd.sh start,或重新启动系统。

== rsync复制 ==

简单的rsync用法是:

{{{rsync -avz rsync://host[:port]/[REPO] .}}}

上面的命令用于通过rsync协议将host:port上面的rsync服务中的REPO collection拿到当前目录。

使用ssh验证的rsync的用法是:

{{{rsync -avz host:/REPO .}}}

----- 
-- delphij (<<Date(2004-11-18T08:10:04Z)>>)