前言

由于开发需要,想要将开发的代码同步部署至两台服务器上,于是考虑到了svn的代码同步svnsync同步方式备份(svnsync是Subversion提供的一个用于同步版本库的工具,通过svnsync可以达到备份SVN版本库的目的。),要用到两个命令:

  1. svnsync init
    初始化,建立本地库和源库之间的同步关系
    命令格式:svnsync init 本地URL 源库URL
  2. svnsync sync
    真正的同步
    命令格式:svnsync sync 本地URL

操作步骤

  1. 创建本地svn库(创建一个空库就行了),省略此步骤

    注意:请确认配置的svn用户有写入权限。且对来源SVN有读取权限,且密码相同。建议用相同用户名和密码,例如我创建的地址是/www/svndata/testsync

  2. 进入hook目录,配置备份SVN的pre-revprop-change文件

    1
    2
    3
    cd /www/svndata/testsync/hooks/
    cp pre-revprop-change.tmpl pre-revprop-change
    vi pre-revprop-change
  3. 修改pre-revprop-change文件

    1
    2
    #限制只有syncuser用户才能提交版本属性修改到此版本库
    if [ "$USER" = "syncuser" ]; then exit 0; fi
  4. 添加权限

    1
    chmod a+x pre-revprop-change
  5. 初始化备份SVN

    1
    2
    svnsync init 本地svn库(用file协议简单安全) 源库(远程访问地址) --username test --password 123456
    svnsync init file:///D:/svndata/testsync svn://47.00.00.89/projectname --username test --password 123456

    如果运行正确,则会输出:Copied properties for revision 0.

  6. 命令运行后会提示,选择yes即可,后面再运行备份命令就可以不用再输入用户名和密码了

  7. 在备份服务器测试数据同步,运行命令(初次运行命令可能会等待一会,时间根据源库文件数量有差异)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    svnsync synchronize file:///D:/svndata/testsync --username test --password 123456

    # 成功则输出以下的信息:
    Committed revision 1.
    Copied properties for revision 1.
    Committed revision 2.
    Copied properties for revision 2.
    Committed revision 3.
    Copied properties for revision 3.
    Committed revision 4.
    Copied properties for revision 4.
    Committed revision 5.
    Copied properties for revision 5.
    Committed revision 6.
    Copied properties for revision 6.
    ......

等待迁移完成,进行版本校验

1
svnadmin verify /usr/local/svn_home/repostory

没提示错误,代表迁移成功

  1. 钩子创建及实时备份
    如果本地库没有创建钩子的话,需要在每次执行完备份命令后,再手动执行svn up
    可以创建钩子实现代码同步。在源库中创建钩子通过配置post-commit hook(同步的仓库hooks中创建post-commit.bat 文件,文件内容如下所示),启用实时备份
    1
    svnsync sync --non-interactive svn://47.00.00.89/testsync --username test --password 123456
    这样设置后在向源库服务器svn提交数据时,就会自动同步到目标库!

遇到的问题

  1. Repository has not been enabled to accept revision propchanges?
    解决方案:新建 pre-revprop-change.bat(全部内容只有一行:exit 0)
  2. “svnsync: Revprop change blocked by pre-revprop-change hook (exit code 255) with output…”?
    解决方案:提升pre-revprop-change.bat权限
  3. svnsync: E000022: 目标 HEAD (25)不是最后合并版本(24);你是否使用非 svnsync 方法提交到目标版本库?
    解决方案:更新样本库代码与最后合并版本的源码一致,人为调整至最后合并的版本号,继续更新
    跳过版本更新命令:
    1
    2
    3
    svn propset  --revprop -r0 svn:sync-last-merged-rev 24  http://Y.Y.Y.Y/svn/repo/

    svnsync sync --non-interactive http://Y.Y.Y.Y/svn/repo/ --sync-username user --sync-password userpasswd
  4. 同步出错E000022: Failed to get lock on destination repos
    解决方案:
    1
    svn propdel svn:sync-lock --revprop -r 0 file:///var/svn/repositories/test/

参考链接:https://blog.csdn.net/zdzzn1314/article/details/107515852