svnsync同步备份svn版本库
2013-02-22 16:04
330 查看
前言
大家都知道,代码对整个IT公司来说就是生命,小中型公司由于人员水平问题,大部分都采用svn进行代码的版本化控制,因此svn的版本库备份显得至关重要,这里我介绍svnsync实现svn的版本库同步,并且将实现过程脚本化需求
同步的主版本库位于A服务器(192.168.1.1),基于apache进行访问控制,配置根目录下有test[1-9]这9个版本库,采用http协议进行访问镜像版本库位于B服务器(192.168.1.2),基于apache进行访问控制,采用http协议进行访问
授权访问控制
由于主版本库和镜像版本库都采用libapache2-svn模块进行权限访问控制,因此我们首先需要提供一个svn检出用户,该用户对于A、B服务器上的所有版本库均具有读写权限假设该svn检出用户为:
--username root --password root
镜像服务器创建目标版本库
创建版本库
镜像服务器B需要创建同主服务器A名称相同的版本库,这样才能进行同步备份采用svnadmin create命令进行创建版本库
修改目标库的pre-revprop-change
源代码
#!/bin/bash REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5" if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi echo "Changing revision properties other than svn:log is prohibited" >&2 exit 1
脚本阅读
如果修改的是svn:log属性,则返回0,允许修改,其它的属性则返回-1,不允许修改我们需要修改版本库的所有属性,因此我们需要此脚本直接返回0成功,因此需要将exit -1改为exit 0
修改后代码
#!/bin/bash REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5" if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi echo "Changing revision properties other than svn:log is prohibited" >&2 exit 0
实现脚本(bash)
#!/bin/bash #变量定义 svnstorage=("test1" "test2" "test3" "test4" "test5" "test6" "test7" "test8" "test9") svndir="/srv/svn" if [ ! -d $svndir ]; then mkdir -p $svndir chown -R www-data.www-data $svndir fi #循环创建目标版本库 for svn in ${svnstorage[*]} do #删除已有的svn版本库 if [ -d $svndir/$svn ]; then rm -r $svndir/$svn fi #创建目标版本库 svnadmin create $svndir/$svn #修改pre-revprop-change cp $svndir/$svn/hooks/pre-revprop-change.tmpl $svndir/$svn/hooks/pre-revprop-change chmod +x $svndir/$svn/hooks/pre-revprop-change sed -i "s/exit 1/exit 0/g" $svndir/$svn/hooks/pre-revprop-change #修改版本库属主(svn通过apache使用http协议访问,因此属主为www-data) chown -R www-data.www-data $svndir/$svn done
初始化&&同步
初始化命令
初始化,建立目标库与源库之间的同步关系svnsync initialize 目标库URL 源库URL
同步命令
svnsync synchronize 目标库URL
实现脚本
为了实现镜像版本库的同步,因此将可以同时访问A&&B服务器上的版本库的用户名和密码用变量的方式写在了脚本中#!/bin/bash #变量定义 svnstorage=("test1" "test2" "test3") svndir="/srv/svn" if [ ! -d $svndir ]; then mkdir -p $svndir chown -R www-data.www-data $svndir fi #循环创建目标版本库 for svn in ${svnstorage[*]} do #删除已有的svn版本库 if [ -d $svndir/$svn ]; then rm -r $svndir/$svn fi #创建目标版本库 svnadmin create $svndir/$svn #修改pre-revprop-change cp $svndir/$svn/hooks/pre-revprop-change.tmpl $svndir/$svn/hooks/pre-revprop-change chmod +x $svndir/$svn/hooks/pre-revprop-change sed -i "s/exit 1/exit 0/g" $svndir/$svn/hooks/pre-revprop-change #修改版本库属性 chown -R www-data.www-data $svndir/$svn done #初始化&&同步目标版本库 localip="192.168.1.2" remoteip="192.168.1.1" username="root" password="root" for svn in ${svnstorage[*]} do #初始化 svnsync initialize http://$localip/svn/$svn http://$remoteip/svn/$svn --username $username --password $password #同步 if [ $? -eq 0 ]; then svnsync synchronize http://$localip/svn/$svn --username $username --password $password fi done
镜像服务器同步更新
需求
以A服务器的test1版本库为例,如果有人提交代码到test1,相应的B服务器的镜像版本库test1需要同步更新post-commit钩子自动同步
在A服务器源库test1的hooks目录下的post-commit脚本里增加如下代码:SVNSYNC=/usr/bin/svnsync $SVNSYNC sync --non-interactive http://目标库URI --username root --password root
镜像版本库与源库UUID一致性问题
通过svnlook来查看镜像版本库和源库的uuid是否一致,如果不一致,可以采用如下方法:查看源库的uuid
svnlook uuid $svn_path
更新镜像库的uuid
sudo svnadmin setuuid $svn_path $源库uuid
查看更新后的镜像库的uuid
svnlook uuid $svn_path
更新svn提交地址到镜像版本库
命令
cd svn根目录 svn switch --relocate http://oldcheckpath http://newcheckpath[/code]后记
2013年2月22日 转载此文章请注明作者和出处,请勿用于任何商业用途
相关文章推荐
- svnsync同步备份svn版本库
- 使用svnsync同步备份svn版本库
- 用svnsync 同步备份任意两个svn版本库
- 用svnsync 同步备份 svn 版本库 从一台服务器到另一台服务器
- 用svnsync 同步备份 svn 版本库 从一台服务器到令一台服务器
- SVN:利用svnsync定时单向备份同步版本库
- svn 完全备份、增量备份、同步版本库
- 使用svnsync实现版本库的同步备份
- 用svnsync 同步备份 svn 版本库 从一台服务器到另一台服务器
- 用svnsync 同步备份 svn 版本库 从一台服务器到令一台服务器
- svn实现版本库同步备份
- svn 完全备份、增量备份、同步版本库
- SVN版本库无损迁移与自动备份(一)
- SVN版本库无损迁移与自动备份(二)
- 利用svnsync实现svn服务器的主从备份
- 使用svnsync实时备份SVN版本库
- SVN版本库无损迁移与自动备份(一)
- SVN版本库无损迁移与自动备份(二)
- 四、SVN的版本库的批量备份
- 备份完成后,启动svn,对外提供版本库服务