文件同步配置教程:svnsync同步备份svn版本库

发布时间:2019-12-20编辑:脚本学堂
本文介绍了svnsync同步备份svn版本库,svnsync实现svn的版本库同步,实现过程脚本化操作的详细教程,感兴趣的朋友参考下。

svnsync实现svn的版本库同步,实现过程脚本化。

1、需求分析:
同步的主版本库位于A服务器(192.168.1.1),基于apache进行访问控制,配置根目录下有test[1-9]这9个版本库,采用http协议进行访问。

镜像版本库位于B服务器(192.168.1.2),基于apache进行访问控制,采用http协议进行访问。

2、授权访问控制:
由于主版本库和镜像版本库都采用libapache2-svn模块进行权限访问控制,需要提供一个svn检出用户,该用户对于A、B服务器上的所有版本库均具有读写权限。

3、假设该svn检出用户为:
 

--username root 
--password  root 

4、镜像服务器创建目标版本库

创建版本库
镜像服务器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