我有一个巨大的 Subversion 存储库,并想创建一个从属存储库以用于实时备份。
但是我不想将修订历史重播到从库中,因为考虑到我的存储库的大小,这实际上需要几天时间。我已经拥有了常用的基础设施,例如钩子脚本和两个服务于主库和即将成为从库的存储库的 Web 服务器。
我该怎么做呢?
答案1
Subversion 能够支持一个或多个从属存储库,您可以使用钩子脚本同步这些存储库,或者您可以使用为您运行 svnsync 的 cron 作业。当您创建从属存储库时,除其他事项外,该过程还涉及创建仅具有修订版 0 的存储库,然后将所有提交从主存储库重放到该从属存储库。根据您的带宽和存储库的大小,这可能需要很长时间。
有一种更快捷的方法可以做到这一点。它涉及将当前主服务器复制到新位置,然后执行一些技巧将其转变为从服务器。我将自动或实时同步的实际实现留给您。
在这个答案中我们假设:
- 该存储库的名称是“repo”
- 可以通过文件系统访问主服务器
- 从服务器可访问https://slave.example.org/repo
我曾多次在 20+ GB 的 Subversion 存储库中使用这种方法,我也通过将以这种方式创建的从属服务器复制回主服务器,成功地恢复了几次损坏的主服务器。
我们将复制主版本并将其传输到远程服务器,在您的存储库所在的目录中执行以下操作:
svnadmin hotcopy repo repo_bak
tar -cjf repo_bak.tar.bz repo_bak
scp repo_bak.tar.bz [email protected]:/path/
hotcopy 命令允许您安全地复制当前正在使用的存储库并保持其一致性。
在从属服务器上解压 tarball 并执行所有操作...
我们假设您在从属服务器上运行一个配置为以常规方式为存储库提供服务的 Web 服务器。此外,它还需要钩子脚本来阻止除同步帐户之外的任何帐户提交,出于显而易见的原因,我们希望存储库完全相同。同样,如何做到这一点超出了本答案的范围。
我们在主存储库上运行以下所有命令。
将主存储库绑定到从存储库:
svn propset svn:sync-from-url --revprop -r 0 file:///example/path/repo https://slave.example.org/repo
找出从属存储库的修订版本,这还将为您提供下面所需的 UUID:
svn info https://slave.example.org/repo
在以下命令中使用上面找到的修订版本:
svn propset svn:sync-last-merged-rev --revprop -r 0 REVISION_OF_SLAVE https://slave.example.org/repo
我们需要使用上面找到的 UUID 添加到主存储库:
svn propset svn:sync-from-uuid --revprop -r 0 UUID_OF_SLAVE https://slave.example.com/repo
如果一切顺利,您现在可以成功同步从属设备:
svnsync sync https://slave.example.org/repo
答案2
合适的地方阅读有关通过 svnsync 运行 Subversion 的存储库复制的信息:
- 同步文件在 Subversion 仓库中(起点)
- 使用 svnsync在 Paul Querna 的博客中(如果某一刻出现麻烦)
PS-你必须具有master-repo 的完整镜像在奴隶身上,但是你可以试试不是从空的 repo 开始,而是克隆到svnadmin dump
某个点(不是热复制!)