svnsync配合post-commit钩子可实现实时异地物理备份:需确保网络连通(推荐HTTP/HTTPS)、备份库启用pre-revprop-change(仅exit 0)、专用同步账户最小权限配置、初始化后通过钩子自动触发增量同步。

用 svnsync 配合钩子脚本,就能让源SVN服务器在每次提交时自动把变更同步到异地物理机房的备份服务器上。核心是确保两地网络可达、权限配置正确、钩子启用到位——不依赖定时任务,真正实现实时物理备份。
确保异地网络连通与访问协议可用
异地机房之间必须能稳定通信。推荐使用 HTTP(S) 协议(比 svn:// 更易穿越防火墙和 NAT),避免用 file:// 或 svn://(后者常受限于端口和路由)。
- 在备份服务器上部署 SVN + Apache/HTTP 服务(如 VisualSVN Server 或自建 httpd + mod_dav_svn),开放对应端口(如 80 / 443 / 8443)
- 源服务器需能 curl 或浏览器访问备份库 URL,例如:
curl -I http://backup-ip:8443/svn/myrepo应返回 200 - 若用 HTTPS,首次初始化时可能提示证书问题,输入 P 接受即可(或提前导入证书)
备份库必须启用 revision 属性修改权限
svnsync 在同步过程中会修改 svn:log 等版本属性,否则初始化或同步会失败,报错类似 E165006: Repository has not been enabled to accept revision propchanges。
- 进入备份库的
hooks/目录(如/var/svn/backup/myrepo/hooks/或D:\Repositories\myrepo\hooks\) - 复制
pre-revprop-change.tmpl为pre-revprop-change(Linux)或pre-revprop-change.bat(Windows) - 内容仅保留一行:
exit 0(Linux)或exit 0(Windows bat 文件) - Linux 下执行:
chmod +x pre-revprop-change;Windows 下确保文件可执行(无权限拦截)
两边创建专用同步账户并配好权限
不要复用开发账号,单独建一个 svnsync 类账户,最小权限原则:
-
源库:该账户只需 读权限(
authz中设为=r或只读组),svnserve.conf中anon-access = none,auth-access = read -
备份库:该账户需 读写权限(
authz中设为=rw),且realm名称可不同,但密码必须一致 - 两个库的
passwd文件中都添加同一用户名密码,例如:svnsync = mysecurepass
初始化 + 钩子自动触发同步
完成上述准备后,按顺序执行:
-
初始化关联(在源服务器或任意能访问两端的机器执行):
svnsync init --username svnsync --password mysecurepass http://backup-ip:8443/svn/myrepo https://source-ip/svn/myrepo -
首次全量同步(建议停写期间执行,或选业务低峰):
svnsync sync http://backup-ip:8443/svn/myrepo -
配置自动触发:在源库
hooks/post-commit(Linux)或post-commit.bat(Windows)末尾追加:svnsync sync --non-interactive http://backup-ip:8443/svn/myrepo --username svnsync --password mysecurepass > /dev/null 2>&1 &(Linux)
或svnsync sync --non-interactive http://backup-ip:8443/svn/myrepo --username svnsync --password mysecurepass > nul 2>&1(Windows) - 赋予钩子可执行权限(Linux):
chmod +x post-commit
配置完成后,每次向源库 commit,都会自动触发一次增量同步。备份库与源库保持完全镜像,且物理隔离于异地机房,满足灾备要求。

















