svn镜像的快速实现

2016-09-15 22:19:00

需求

在实际的应用环境,现有的SVN代码库数据量大,而svnsync却需要先初始化一个空库,然后再从0开始一直同步到相同的版本;
而主从服务器之间网络不好,因此需要较长时间或者传输中断。

配置过程:

  • 备份主库(master)
    svnadmin hotcopy path/to/repository path/to/backup –clean-logs
    推荐使用hotcopy ,另外一种方法:
    svnadmin dump http://source-server/svn/source-repo > source-repo.dump

  • 将备份文件拷贝到从服务器上(master)

  • 在slave上创建一个mirror库

    svnadmin create Code
    chown -R apache.apache Code
    cd Code/hooks
    cp -p pre-revprop-change.tmpl pre-revprop-change
    chmod+x pre-revporp-change

    vim pre-revporp-change
    删除以下内容:
    if [ “$ACTION” = “M” -a “$PROPNAME” = “svn:log” ]; then exit 0; fi
    echo “Changing revision properties other than svn:log is prohibited” >&2
    exit 1

  • 设置mirror只对同步用户可写
    [/]* = r
    svnsync = rw
    或者
    使用start-commit 检查svnsync用户,下面是一个例子,是shell脚本:

    #!/bin/sh
    USER=”$2″
    if [ “$USER” = “svnsync” ]; then
    exit 0
    fi
    echo “Only the svnsync user may commit new revisions as this is a read-only, mirror repository.” >&2
    exit 1

  • 在master上通过svnsync 初始化(master)
    svnsync initialize URL_MIRROR_REPO URL_MASTER_REPO –username=svnsync –password=svnsyncpassword
    svnsync init file:///home/backup/svn/svnsync/Project1/ http://svntest.subversion.com/repos/Project1
    语法是:svnsync init {你刚创建的库url} {源库url}
    注意本地url是三个斜杠的:///

    svnsync init http://192.168.1.100/svn/Code http://192.168.1.101/svn/Code –username=svnsync –password=svnsync

  • 在slave上备份初始化后的库(slave)
    cd /data/backup
    mv Code /opt/mirrorbak

  • 将主库备份文件放到相应位置,并进行部分文件替换(slave)

    替换钩子文件
    cd Code/hooks
    cp -p /opt/mirrorbak/hooks/pre-revporp-change .
    替换uuid
    cd ../db/
    cp -p /opt/mirrorbak/hooks/db/uuid .

    替换初始版本日志
    cd revprops/0/
    cp -p /opt/mirrorbak/db/revprops/0/0 .

    更改仓库目录属主
    chown -R apache.apache /data/backup/Code

  • 复制sync-last-merged-rev(最后一次同步)版本号(master)
    获取当前版本号,eg:7289
    cat Code/db/current
    将当前版本好复制到slave
    svn propset –revprop -r0 svn:sync-last-merged-rev 7289 http://192.168.1.100/svn/Code
    执行一次同步
    svnsync sync http://192.168.1.100/svn/Code

  • 配置实时同步
    在主库的hooks目录下开启post-commit
    mv post-commit.tmpl post-commit
    chmod +x post-commit
    svnsync synchronize http://192.168.1.100/svn/Code –username=svnsync –password=svnsync &
    exit 0

  • 配置slave只让sync用户提交

    pre-revprop-change
    if [ “$USER” = “svnsync” ]; then
    exit 0
    fi
    echo “Only the svnsync user may change revision properties as this is a read-only, mirror repository.” >&2
    exit 1


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。