svnsync仅支持单向主从同步,不可用于双向场景;其正确用法是构建只读镜像库,通过初始化、定时增量同步及手动接管实现异地容灾。
svnsync 本身不支持真正的双向同步,它是一个单向、只读复制工具,设计初衷是构建主从式备份(master-slave),即从源库(source)向目标库(destination)单向推送变更。强行“双向”会引发版本历史冲突、修订版本号(revision)错乱、svn:sync-* 属性污染等问题,Subversion 官方明确不推荐也不保障双向场景。
但若目标是异地容灾(即主站点故障时快速切换至备用站点,并保持数据尽可能一致),可采用 “主备切换 + 单向同步 + 手动接管” 的可靠方案。以下是实用、可落地的搭建逻辑:
选一台稳定服务器作为主库(Production),另一台异地机房机器作为备库(DR Site)。两者需满足:
备库必须是全新空库,且配置专用钩子允许 svnsync 写入元数据:
svnadmin create /path/to/backup_repo;hooks/ 目录,将 pre-revprop-change.tmpl 复制为 pre-revprop-change(Linux)或 pre-revprop-change.bat(Windows);exit 0(Linux)或 exit /b 0(Windows),禁止任何条件判断;chmod a+x pre-revprop-change(Linux)或确认 bat 文件可被 svn 进程调用(Windows)。所有操作在备库所在机器上执行:
svnsync init http://dr-server:8080/svn/backup_repo svn://master-server/svn/main_reposync_reader / sync_writer)svnsync sync http://dr-server:8080/svn/backup_repo
svnsync sync --non-interactive http://dr-server:8080/svn/backup_repo --username sync_writer --password xxx
备库默认只读(因 svnsync 不开放提交入口),切换前需人工干预**:
pre-revprop-change(防止意外属性修改干扰);conf/authz 和 conf/passwd,启用正常开发用户写权限;svn switch --relocate 或重新 checkout);svnadmin dump + load 将主库最后若干 revision 补充到备库,确保零丢失。以下错误几乎都源于权限或钩子配置不当:
pre-revprop-change 是否存在、是否可执行、是否返回 0;--no-auth-cache);不复杂但容易忽略:容灾价值不在“自动双向”,而在“可控、可验证、可回退”的单向镜像 + 明确切换流程。真正可靠的异地容灾,靠的是定期演练切换,而不是依赖工具自动兜底。