SVN同步功能

步骤##

假如我们的主服务器是10.0.7.2,从服务器是10.0.5.2,同步使用的svn账号是read

  • 在从服务器上创建一个全新的代码库,并给read账号添加对该代码库的读写权限,然后开启svnserve进程
    svnadmin create /home/zhangsan/svn/web
    /usr/local/subversion/bin/svnserve -d -r /home/zhangsan/svn –config-file /home/lisi/svn/dev/conf/svnserve.conf
  • 在主服务器上,给需要同步的代码库添加一个read账号,该账号对代码库具有可读权限
  • 在从服务器上,编辑代码库的hooks文件夹下面的pre-revprop-change文件,写入如下内容:
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    USER## "$3"

    if [ "$USER" ## "read" ]; then exit 0; fi

    echo "Changing revision properties other than svn:log is prohibited" >&2
    exit 1
  • 在从服务器上初始化备份svn
    svnsync init svn://10.0.5.2/web http://10.0.7.2/web –username=username –password=password
  • 在从服务器上执行同步操作
    svnsync synchronize svn://10.0.5.2/web –username=username –password=password
  • 在主服务器的post-commit钩子文件中增加如下内容,这样主服务器提交代码会自动同步到从服务器
    svnsync synchronize –non-interactive svn://10.0.5.2/web –username=username –password=password

注意事项

  • 备服务器上的代码库,必须是一个全新的代码库;如果已经提交过代码,会报错:
    svnsync: Cannot initialize a repository with content in it

  • pre-revprop-change文件在主从服务器上都必须存在,且必须可执行,否则报错:
    svnsync: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.

  • 同步命令中,主从服务器的顺序不要写反了,备份服务器在前,主服务器在后。如果写反了,会报错:

    1
    2
    3
    svnsync: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent
    svnsync: At least one property change failed; repository is unchanged
    svnsync: Server sent unexpected return value (403 Forbidden) in response to PROPPATCH request for '/web/!svn/bln/0'
  • SVN同步时,源库端会在目标库端加lock,成功同步后释放lock;但当SVN同步异常中断后(比如断掉命令行,或者停电了),lock是不会自动释放的。这时在执行svn sync命令,就可能会出现Failed to get lock on destination repos的问题。可以在去掉锁后继续同步。
    svn propdel svn:sync-lock –revprop -r 0 svn://10.0.5.2/web
    可以先通过svn proplist –revprop -r 0查看某个版本的属性,看看有没有svn:sync-lock属性

  • init报错:svnsync: warning: W200007: Target server does not support atomic revision property edits; consider upgrading it to 1.7 or using an external locking program
    这是因为你需要同步的svn代码库版本过低导致的