subversion 版本库数据迁移,从一台CentOS服务器迁移到另一台CentOS新服务器,迁移方法有多种。

 

迁移方法一 (推荐方案)

直接拷贝复制 SVN 目录,压缩打包复制迁移到另一台服务器,优点是拷贝文件夹大小较小,缺点可能会 subversion 版本不一致,版本日志不全(猜的,实测没有这些问题)

1、本地拷贝备份 SVN 根目录

cp -r /home/data/SVN/ /opt/SVN_bk_20160812
cd /opt/
tar zcvf SVN_bk_20160812.tar.gz SVN_bk_20160812

 

2、另一台服务器上拷贝压缩后的 SVN 根目录

在另一台目标服务器上,把原服务器上备份压缩的 SVN 根目录拷贝过来

cd /opt/
scp -r mimvp@115.28.238.66:/opt/SVN_bk_20160812.tar.gz .

# 输入原服务器密码
tar zxvf SVN_bk_20160812.tar.gz
mv -r SVN_bk_20160812 /home/data/SVN/

 

 

迁移方法二(推荐方案)

svnadmin dump 是官网推荐的 subversion 迁移方法,缺点是dump文件大,拷贝复制时间长

1、本地 dump SVN 根目录

cd /opt/
svnadmin dump /home/data/SVN/repository/ > /opt/SVN_repository_20160812.dump

* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.
* Dumped revision 5.
。。。。。。
* Dumped revision 2715.
* Dumped revision 2716.
* Dumped revision 2717.
* Dumped revision 2718.
* Dumped revision 2719.
* Dumped revision 2720.

tar zcvf SVN_repository_20160812.dump.tar.gz SVN_repository_20160812.dump
du -sh SVN*

896M    SVN
896M    SVN_bk_20160812
833M    SVN_bk_20160812.tar.gz
2.4G    SVN_repository_20160812.dump
1.6G    SVN_repository_20160812.dump.tar.gz

说明:转存文件 SVN_repository_20160812.dump 比原文件的版本库本身 SVN 大很多倍,因为在转存文件中,每个文件的每个版本都以完整的文本形式保存下来。

 

2、另一台服务器上拷贝压缩后的 SVN dump文件

将 SVN_repository_20160812.dump.tar.gz 文件拷贝到新的服务机上,然后将 dump 文件导入

cd /opt/
scp -r mimvp@115.28.238.66:/opt/SVN_repository_20160812.dump.tar.gz .

# 输入原服务器密码
tar zxvf SVN_repository_20160812.dump.tar.gz
# 创建新的版本库
cd /home/data/SVN/
svnadmin create repository

# 将 dump 文件导入
svnadmin load /home/data/SVN/repository/ < /opt/SVN_repository_20160812.dump

<<< Started new transaction, based on original revision 1
     * adding path : branches ... done.
     * adding path : tags ... done.
     * adding path : trunk ... done.

------- Committed revision 1 >>>

<<< Started new transaction, based on original revision 2
     * adding path : trunk/main.c ... done.

------- Committed revision 2 >>>

<<< Started new transaction, based on original revision 3
     * editing path : trunk/main.c ... done.

------- Committed revision 3 >>>

<<< Started new transaction, based on original revision 4
     * editing path : trunk/main.c ... done.

加载恢复 SVN 后,其大小会大幅减少到SVN真实的大小,约 880 M左右

因此,推荐使用迁移方法一,版本都保留了,拷贝文件大小还小,兼容性也可以,不会出错

 

 

迁移方法三

svnsync 同步 subversion 库

源目录:svn://192.168.1.10/repository

目标目录:svn://192.168.1.20/repository

 

1、创建备份版本库

svnadmin create repository

此时 repository下就有hooks目录,拷贝 repository/hooks/pre_revprop-change.tmpl 至 repository/hooks/pre_revprop-change

cd /home/data/SVN/repository/
cp hooks/pre-revprop-change.tmpl hooks/pre-revprop-change
vim hooks/pre-revprop-change

修改 pre_revprop-change 配置文件最后一行,将 exit 1 修改为 exit 0

 

2、初始化版本库

svnsync init repository svn://192.168.1.10/repository

svnsync init 目标库 源库

会向你询问源库的用户名和密码,输入完毕显示 Copied properties for revision 0.

 

3、版本库同步

svnsync sync file:///localhost/repository

sync初次同步是全量备份,可能耗时较长,第一次备份过后,sync后续的备份就是增量备份了

 

4、附上迁移脚本

脚本仅供参考,不可以直接运行,需替换一些参入,如 传入参数、源服务器ip地址等

#!/bin/bash

init_repo() {
    cp $backupdir/$line/hooks/pre-revprop-change.tmpl $backupdir/$line/hooks/pre-revprop-change
    sed -i '3,65d;s/exit 1/exit 0/g' $backupdir/$line/hooks/pre-revprop-change
    chmod a+x $backupdir/$line/hooks/pre-revprop-change
    svnsync init file://$backupdir/$line/ http://ip/svn/$line  --username apache --password 123456 #--allow-non-empty
    if [ $? -eq 0 ];then
        echo " init $backupdir/$line success "
    else
        echo " init $backupdir/$line faild "
        exit 1
    fi
}

create_repo() {
    svnadmin create $backupdir/$line
    if [ $? -eq 0 ];then
        echo " create $backupdir/$line success "
    else
        echo " create $backupdir/$line faild "
        exit 1
    fi
}

sync_repo() {
    cat repofile | while read line
    do
        echo "start $backupdir/$line "
        svnsync sync file://$backupdir/$line  --username apache --password 123456
        if [ $? -eq 0 ];then
                echo " sync $backupdir/$line success "
        else
                echo " sync $backupdir/$line faild "
                exit 1
        fi
    done
}


# 执行入口
backupdir=/data0/www/svnroot
if test -e $backupdir; then
    echo "backup dir exists"
else
    mkdir -p $backupdir
fi

cat repofile | while read line
do
    if test -e $backupdir/$line; then
        echo "repo $backupdir/$line exists"
        if test -e $backupdir/$line/hooks/pre-revprop-change; then
            echo "repo $backupdir/$line has been init"
        else
            init_repo
        fi
    else
        create_repo
        init_repo
    fi
done

echo "start svn sync "
sync_repo

 

 

参考推荐

CentOS 搭建 SVN Server

svn代码量统计工具

SVN常用命令

SVN ignore 忽略文件及目录

GIT和SVN之间的五个基本区别

Linux(Ubuntu)下保存SVN账户密码

git/svn reset/revert 回滚到服务器上的某一个版本

CentOS 7.2 / 6.5 系统安装指引

Ubuntu 配置 Apache

Centos7 使用 sendmail 发送邮件