svnsync实现svn的版本库同步,实现过程脚本化。
1、需求分析: 镜像版本库位于B服务器(192.168.1.2),基于apache进行访问控制,采用http协议进行访问。
2、授权访问控制:
3、假设该svn检出用户为:
--username root
--password root 4、镜像服务器创建目标版本库
创建版本库
修改目标库的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,不允许修改。
修改后代码:
复制代码代码示例:
#!/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 初始化&&同步
初始化命令
同步命令
实现脚本
复制代码代码示例:
#!/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 第二部分,镜像服务器同步更新。
需求
post-commit钩子自动同步
复制代码代码示例:
SVNSYNC=/usr/bin/svnsync
$SVNSYNC sync --non-interactive http://目标库URI --username root --password root
镜像版本库与源库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 (责任编辑:IT) |