SVN迁移并做同步库操作步骤:
1.备份SVN,按项目仓库备份出各仓库。 参考
svnadmin dump E:RepositoriesSoftware >e:svnbakSoftware.dump
2.将SVN上传到服务器。 参考
windows :
pscp -P 22 D:/SVNbak/Software.dump root@IP:/svn/svnbak
linux :
sshpass -p Password scp /u01/svn/bak/Software.dump root@IP:/svn/svnbak/Software.dump
3.linux环境搭建SVN,安装Apache的 httpd功能模组,将SVN协议转为http供客户端访问,权限走http权限。参考《linux-svn-http.txt》
#创建仓库 ,更改文件权限 svnadmin create /data/svn/repository/Software chown -R apache. Software #chown -R apache. /svn/repository #chmod 777 -R /svn/repository/ #启动仓库,httpd映射后不需要启动SVN仓库 #svnserve -d -r /svn/repository #关闭 #kill all svnserve #安装apache服务 #查看httpd是否已经安装的svn模块 ls /etc/httpd/modules/ | grep svn #安装httpd映射 yum --disableexcludes=all install -y httpd #添加模块 yum install mod_dav_svn -y 2、安装完成,对svn版本库下的项目ProjectName进行位置映射 在/etc/httpd/conf.d/文件下创建subversion.conf文件并编辑 # vi subversion.conf LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /repos> DAV svn SVNParentPath /u01/svn/repository/ ##<LimitExcept GET PROPFIND OPTIONS REPORT> AuthType Basic AuthName "Authorization Realm" AuthUserFile /u01/svn/repository/svnusers.conf # 用户文件 AuthzSVNAccessFile /u01/svn/repository/accesspolicy.conf #权限文件 Require valid-user ##</LimitExcept> </Location> #添加用户 htpasswd -mb /svn/repository/svnusers.conf username password# #修改端口 cd /etc/httpd/conf/ cp httpd.conf httpd.conf.bak vim httpd.conf Listen 80这一行,修改为 8000 #添加用户组 groupadd apache useradd -g apache apache service httpd restart
4.重复3操作创建同步库。
5.将各项目备份导入到对应的仓库。参考
svnadmin create /svn/repository/Software svnadmin load /svn/repository/Software< /svn/svnbak/Software.dump
6.每天定时导出当天最新更新的代码备份,并将此备份导入到同步库。参考《增量备份-同步.txt》《Software_bak.sh》《Software_load.sh》
增量备份-同步.txt
#查询两个svn仓库最新版本 svnlook youngest /svn/repository/Software 9434 svnlook youngest /u01/svn/repository/Software 9482 #svnadmin dump命令做版本区间 -r 9435:9482 的备份 svnadmin dump /svn/repository/Software -r 9435:9482 --incremental > /svn/svnbak/Software_20200908.dump # 将备份文件传到服务器 sshpass -p **** scp /u01/svn/bak/Software_20200908.dump root@47.104.103.86:/svn/svnbak/Software_20200908.dump #导入备份到svn仓库 svnadmin load /svn/repository/Software< /svn/svnbak/Software_20200908.dump #搭建完以后发现可以update但不能提交的一个问题: #Error: could not begin a transaction chcon -R -t httpd_sys_rw_content_t /u01/svn/repository/Software/ #添加定时任务 crontab -e 30 23 * * * root /u01/svn/bak/Software_bak.sh 30 1 * * * root /svn/svnbak/Software_load.sh > /dev/null
Software_bak.sh
#!/bin/bash #set -x #function:SVN增量备份 #Author: heshan svn_repos="/u01/svn/repository/Software" #版本库 backup_dir="/u01/svn/bak" #nfs挂载从服务器192.168.1.x的目录 next_backup_file="Software_backup".`date +%Y%m%d` #增量备份文件 log="$backup_dir/Software_backed_up.log" #日志文件 repo="$backup_dir/svn.txt" #记录版本库最新版本 sshpass -p Guideir@2020 scp root@47.104.103.86:/svn/svnbak/slave.txt $backup_dir/slave.txt echo "********************"`date`"***************">> $log if [ -f $repo ];then echo " $repo 文件存在!" >> $log else echo " $repo 文件不存在!" >> $log touch $repo echo "0">$repo #从0开始备份 fi echo "SVN ADD DUMP start!">> $log first_rev="`cat $repo`" #备份起点 echo "$first_rev 备份起点">> $log last_rev="`svnlook youngest $svn_repos`" #注服务器版本库最新版本 echo "$last_rev 本机服务最新版本">> $log backup_repo="$backup_dir/slave.txt" echo "$backup_repo 目标下移个开始版本">> $log if [ -f $backup_repo ];then echo " $backup_repo 文件存在!" >> $log else echo " $backup_repo 文件不存在!" >> $log touch $backup_repo exit 0 #echo "0">$backup_repo #第一次 从0开始 fi slave_rev="`cat $backup_repo`" #从服务器提供的校验版本 echo "$slave_rev 从服务器提供的校验版本">> $log if [ "$first_rev" -ne "$slave_rev" ];then #echo"SVN Slaves is error, please check. " | mail -s "SVN slave is ERROR! first_rev !== slave_rev" #主服务器备份起点版本和从>数据最后版本不一致,则邮件报警 echo "SVN 主从服务脚本中版本号不一致, 请检查备份开始版本号!">> $log exit 0 else if [ "$first_rev" -le "$last_rev" ];then svnadmin dump --incremental --revision $first_rev:$last_rev $svn_repos > $backup_dir/$next_backup_file #上一次记录的版本,到>最新版本的增量备份 else echo " no update record!" >> $log #rm -rf $backup_dir/access.conf #rm -rf $backup_dir/auth.conf #cp $svn_repos/access.conf $backup_dir/ #cp $svn_repos/auth.conf $backup_dir/ exit 0 fi fi echo "Fist:$first_rev">> $log echo "Last:$last_rev">> $log #写入日志文件 #dump_rev=`awk "BEGIN{a=$last_rev;b="1";c=(a+b);print c}"` #下一次备份起点,重点 +1版本,否则报错 dump_rev="`/usr/bin/expr $last_rev + 1 `" echo "$dump_rev " echo $dump_rev>$repo #覆盖上一次备份起点 #删除之前的增量备份文件 rm -rf $backup_dir/Software_backup.$(date +%Y%m%d --date='1 days ago') sshpass -p Guideir@2020 scp $backup_dir/$next_backup_file root@47.104.103.86:/svn/svnbak/$next_backup_file
Software_load.sh
#!/bin/bash #set -x #function #Author heshan svn_repos="/svn/repository/Software" backup_dir="/svn/svnbak" backup_file="Software_backup".$(date +%Y%m%d --date='1 days ago') log="$backup_dir/logs/last_load.log".`date +%Y%m%d` echo "********************"`date`"***************">> $log echo "SVN load start!">> $log first_rev="`svnlook youngest $svn_repos`" echo "First:$first_rev">> $log if [ -f $backup_dir/$backup_file ];then svnadmin load $svn_repos < $backup_dir/$backup_file 2>&1 >>$log #¦Ì¨¨¡À¡¤Y?t else echo " $backup_dir/$backup_file ??t2?¡ä no dump to load!" >> $log exit 0 fi last_rev="`svnlook youngest $svn_repos`" echo "Last:$last_rev">> $log repo_slave=`awk "BEGIN{a=$last_rev;b="1";c=(a+b);print c}"` echo "Next:$repo_slave">> $log echo "$repo_slave">$backup_dir/slave.txt echo "********************"`date`"***************">>$log rm -rf "Software_backup".$(date +%Y%m%d --date='2 days ago') echo "SVN load Eed!">> $log