11/16/2008

使用svnsync镜像版本库

术语

* 主(Master): 将要通过svnsync被同步的活动读/写版本库。
* 镜像(Mirror): 将要与master通过svnsync同步的只读版本库。
注意,svn的版本要大于1.4

实现

实现svnsync的唯一的前提条件是创建一个希望镜像的版本库,一旦创建,你就可以按照下面步骤继续:

Step 1: 创建镜像Repository


svnadmin create MIRROR_REPO_PATH

Step 2: 设置镜像版本库只对同步用户可写

为了让镜像版本库只被同步用户写,我们的例子里用户名是”svnsync”,我们有一些选项,一个就是使用Subversion的授权功能设置缺省的访问规则(在auth文件里设置):

[/]
* = r
svnsync = rw #MIRROR_REPO_USER


Step 3: 让镜像版本库使用同步用户修改修订版本属性

为此,我们需要创建一个pre-revprop-change钩子,类似于下面的例子,也是shell脚本,在hook文件夹里,有一个建立一个per-revprop-change的文件(不用管他的模版文件),将下面的内容复制:

#!/bin/sh

USER="$3"

if [ "$USER" = "MIRROR_REPO_USER" ]; then exit 0; fi

echo “Only the syncuser user may change revision properties as this is a read-only, mirror repository.” >&2

exit 1

然后修改这个文件的属性为777

Step 4: 注册同步的镜像版本库
在任何平台使用下面的svnsync命令:
svnsync initialize URL_TO_MIRROR_REPO URL_TO_MASTER_REPO --username=MASTER_REPO_USER --password=MASTER_REPO_PASSWD

如果所有的配置正确,你一定会看到下面的输出:

Copied properties for revision 0.

如果有错误,一般就是上步钩子的问题,仔细阅读错误信息,可以纠正。现在你已经注册了镜像版本库与主版本库的同步,我们必须继续执行初始的同步,这样镜像版本库才和主版本库是一样的了。

Step 5: 执行初始同步

为了确定所有事情已经准备好了,并且执行初始同步,在任何系统只需要执行:

svnsync synchronize URL_TO_MIRROR_REPO --username=MASTER_REPO_USER --password=MASTER_REPO_PASSWD

如果所有的同步正确,你会看到类似的输出:

Committed revision 1.
Copied properties for revision 1.
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.

不过在这里可能会出现 “svnsync: Couldn't get lock on destination repos after 10 attempts”类似的报错,你需要手动清除lock

svn pdel --revprop -r 0 svn:sync-lock --username=MIRROR_REPO_USER URL_TO_MIRROR_REPO

Step 6: 使用post-commit钩子自动同步

根据初始同步的输出,我们现在要做的就是写一个定时执行或post-commit钩子来同步镜像版本库,我建议post-commit,因为它让你的镜像版本库尽可能的最新,下面是可以用在主版本库上同步镜像版本库的post-commit钩子,一个shell脚本:

# Example for synchronizing one repository from the post-commit hook
#!/bin/sh
SVNSYNC=/usr/local/bin/svnsync
$SVNSYNC synchronize URL_TO_MIRROR_REPO –username=svnsync –password=svnsyncpassword &

exit 0

就这样了,一旦你执行了上面列出的步骤,你一定可以得到一个随着主版本库提交自动更新的镜像版本库,我们对于svnsync的介绍和如何去实现它。

No comments: