svnsync同步版本库

假设有一个主版本库(Master)需要同步到另外一个服务器的新库(Mirror)当中以达到备份的效果。

主(Master): 将要通过svnsync被同步的活动读/写版本库。
镜像(Mirror): 将要与master通过svnsync同步的只读版本库。
Subversion 1.4发布之后,svnsync工具就成了标准Subversion的一部分,可以用”一个可以维护只读Subversion镜像所有功能的工具”描述, 从它的文档中理解它的目的非常简单,为什么在企业中维护一个镜像版本库非常重要?每个Subversion实现都不一样,可能有很多原因,但是有一些是共 同的原因:

提供了版本库的备份,这样可以使灾后恢复和软件升级方面得到好处。
提供了一个简单的只读版本库,一些人希望提供简单的只读访问版本库,通过svnsync你可以简单的达到这个目标而无需维护授权文件或其他。(例如:维护一个版本库的社区访问点,同时另一个不同的版本库给开发者使用)
有很多例子,但是必须提供一个svnsync可以提供什么的思想。(更详细的解释,请参考”使用Subversion进行版本控制“的”Repository维护“) 现在我可以投入到脚本建议和例子上了,这有点可耻吧。为了确实理解我们为什么这样做,我们必须理解svnsync的工作。我会简短解释,然后会进入例子脚本和建议,你可以将其应用到你的Subversion实现。

理解svnsync
svnsync工作方式非常简单:将一个版本库的修订版本”重放”到另一个,这意味着镜像版本库和主版本库使用相同的规则,对镜像版本库执行操作的 用户必须对其有完全的写权限,而秘诀就是Subversion在镜像版本库的修订版本0上维护了必要的元数据,从而可以知道应该同步什么。svnsync 工作原理非常容易理解,但是让svnsync依设计工作,还是有一些规则,你需要知道这一点。下面是一些规则和使用svnsync的最佳实践:

同步用户需要对整个版本库有读/写权限
同步用户需要能够修改特定修订版本属性
镜像版本库需要对除同步用户以外的用户只读
在你同步一个镜像版本库之前,镜像版本库需要在修订版本0
现在,我们知道什么是svnsync了,也知道了它的工作原理以及为什么有用,让我们通过对主版本库使用svnsync开始同步一个镜像版本库。

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

Step 1: 创建镜像Repository

svnadmin create MIRROR_REPO_PATH

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

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

[/]* = r svnsync = rw

另一个选项就是使用start-commit 检查svnsync用户,下面是一个例子,是shell脚本:

#!/bin/sh USER=”$2″ if [ “$USER“ =“svnsync” ]; then exit 0 fi echo “Only the svnsync user may commit new revisions as this is a read-only, mirror repository." >&2 exit 1

Step 3: 让镜像版本库使用同步用户修改修订版本属性
为此,我们需要创建一个pre-revprop-change钩子,类似于下面的例子,也是shell脚本:

#!/bin/sh USER=”$3″ if [ “$USER” =“svnsync” ]; then exit 0 fi echo “Only the svnsync user may change revision properties as this is a read-only, mirror repository." >&2 exit 1

Step 4: 注册同步的镜像版本库
在任何平台使用下面的svnsync命令:

svnsync initialize URL_MIRROR_REPO URL_MASTER_REPO --username=svnsync --password=svnsyncpassword

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

Copied properties for revision 0.

现在你已经注册了镜像版本库与主版本库的同步,我们必须继续执行初始的同步,这样镜像版本库才和主版本库是一样的了。

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

svnsync synchronize URL_TO_MIRROR_REPO --username=svnsync --password=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.…

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

注:上述钩子脚本需用 chmod 755 使之可运行。

排错:
Subversion同步工具svnsync出错:Failed to get lock on destination repos
同步工具svnsync在使用svnsync同步两个版本库时经常出现如下的错误,并自动中断了同步操作:

Copied properties for revision 461.
svnsync: Server sent unexpected return value (502 Bad Gateway) in response to PR
OPFIND request for ‘/svn/!svn/vcc/default’

当再次运行 svnsync sync svn://localhost/jqueryjs 时,有可能出现”Failed to get lock on destination repos”的错误信息,使同步操作无法继续进行:

svnsync sync svn://localhost/jqueryjs
Failed to get lock on destination repos, currently held by ‘firehack:963c0909-45ad-644f-b383-7e35d445028f’
……
Failed to get lock on destination repos, currently held by ‘firehack:963c0909-45ad-644f-b383-7e35d445028f’
svnsync: Couldn’t get lock on destination repos after 10 attempts

解决办法:

删除SVN仓库修订号0 svn:sync-lock的保护. svn propdel svn:sync-lock --revprop -r 0 http://some.domain.com/svn/projects

时间: 2024-10-14 00:39:03

svnsync同步版本库的相关文章

linux下svnsync同步版本库配置

svnsync可以方便的把另一个源svn版本同步到指定版本库中,为多版本库应用提供方便. 示例: (版本库所存目录  /svn/  下) 源版本库:  svn://196.168.0.1/testA      同步用户:sync_source 密码:123456 目标版本库: svn://196.168.0.2/testB    同步用户:sync 密码:123456 源版本库用于开发编辑提交等应用,目标版本库只能可读用于上线备份等应用. 进入目标服务器: 编辑sync同步必要hooks脚本pr

svnsync实现版本库的同步备份

svnsync实现版本库的同步备份 实验环境: A,172.17.201.243(主) B,172.17.201.88(备) 项目需求,生产环境要求svn服务器实现热备机制,于是就想到了svn自带的svnsync机制,操作流程如下: 1.在要备份的机器上(172.17.201.88)建立版本库 mkdir -p /home/svn/SH2014/SVNdata svnadmin create /home/svn/SH2014/SVNdata 2.进入备份机器(172.17.201.88)版本库S

SVN同步版本库与网站目录

如何创建SVN版本库及同步文件到WEB目录 来源:空谷 一 安装与配置SVN 1.安装subversion centos: yum install subversion ubuntu: apt-get install subversion 2.建立版本库,本例中我们的版本库建立在/var/svn,假设该版本库目录为:foo cd /var mkdir svn svnadmin create foo 3.配置版本库 刚才建立的版本库,需要配置认证方式,用户名和密码,权限配置这三个文件,分别对应/v

SVN同步版本库与网站目录2

定义: SVN版本库  = /home/svn/repos  网站目录     = /var/www/web 1.检出一个项目到网站目录 #svn checkout file:///home/svn/repos /var/www/web 这时,网站目录已成为SVN的工作副本,我们要做的就是让这个工作副本自动更新. 2.增加hooks(钩子)文件 # vim /home/svn/repos/hooks/post-commit #!/bin/sh export LANG="zh_CN.UTF-8&q

SVN版本库的异地备份

 现在开发通常都会用SVN来进行版本控制,并且SVN服务端也都会统一的建立到某个服务器上来保存项目源码,这没什么问题.但是如果有一天服务器发生了不可恢复的故障,这将造成不可弥补的巨大损失.所以我们要做好备份工作,当主版本库出现问题时,可切换到备用版本库,从而提高SVN的可用性. 今天介绍的就是SVN版本库的远程自动备份,将版本库备份到另一台机器上.当然实现的方式是多种多样的,我采用的是SVN的svnsync工具来同步版本库. 同步备份所需要的命令 1)svnsync init 初始化,建立目

用svnsync 同步备份 svn 版本库 从一台服务器到另一台服务器

如用svnsync 同步备份两台机器的svn .(就以linux服务器到windows服务器为例子) 要同步的项目名称:source_svn svn 版本库1 .4 以上 源目录:            svn://192.168.16.199/source_svn 同步目标目录:      http:// 目标IP:8080/source_svnbak 方法: 1.如果目标目录存在相同的项目,请先清除,重新建立空项目 2.在目标服务器中建立svn版本库source_svnbak svnadmi

windows下SVN版本库迁移小结

SVN需求:搬迁至异地上云环境,迁移过程将影响用户的时间减少至最小. SVN常见的几种迁移方案: 第一种:整个SVN库目录打包迁移,原库大小17G,打包加迁移时间预估时间约5小时以上,中断不符合要求. 第二种:svnadmin 自带的dump导出load导入方式迁移 :所有版本导出大小超过了磁盘剩余空间(不小于40G),中断不符合要求. 第三种:通过svnsync钩子脚本同步方式进行第一次全量同步,迁移时增量同步(预计最快时间十分钟左右). 利用svnsync同步过程: 1. 原SVN服务器与目

迁移google code上的项目到本地版本库

今年五月份以来就已经连接不上google code了,翻*墙又极度不稳定,在忍受了几个月之后终于决定将项目搬离google code;经过研究之后终于实现了搬迁到本地,最后总结成下文.一者期望对有需要的人有一点点帮助,二者记录下来以备查阅. 一. 创建本地版本仓库 打开需创建的本地版本库目录eg:D:\WinPath\desktop\11 右键->"TortoiseSVN"->"Create repository here"->"ok&q

使用svnsync同步svn

使用svnsync实现已有版本库的镜像 svn不支持分布式开发,所以把svn版本库保存在一台服务器上是不安全的.制作一个镜像svn版本库有多种方式,我采用subversion自带的svnsync程序. 源版本库路径:http://192.168.0.100/svn/project 镜像版本库路径:/var/svn/project 建立镜像版本库 svnadmin create /var/svn/project # 创建钩子 cp /var/svn/project/hooks/pre-revpro