在Subversion中,如何在当前修订版本中创build一个从版本库?

我有一个巨大的Subversion版本库,并希望创build一个用于实时备份目的的从属资料库。

不过,我不想重播修改历史到奴隶,因为这将需要几天,由于我的存储库的大小。 我已经有了通常的基础设施,例如钩子脚本和两台服务于主服务器的主服务器,并且很快成为从服务器库。

我该怎么做呢?

Subversion有能力支持一个或多个可以使用钩子脚本来同步的slave存储库,或者你可以使用一个为你运行svnsync的cron作业。 当你创build一个从属仓库的时候,这个过程涉及到创build一个只有版本0的仓库,然后你重放所有从主仓库到这个从仓库的提交。 根据您的带宽和存储库的大小,这可能需要很长时间。

有一个更快的方法来做到这一点。 它涉及将当前的主人复制到新的位置,然后执行一些技巧将其变成奴隶。 我将离开自动或实时同步的实际执行。

在这个答案中,我们假设:

我已经多次使用这个方法,使用了一个20多GB的Subversion版本库,通过将这样创build的slave复制回master,我也成功地恢复了一个破损的master。

我们将复制主服务器并将其传输到远程服务器上的资源所在的目录:

svnadmin hotcopy repo repo_bak tar -cjf repo_bak.tar.bz repo_bak scp repo_bak.tar.bz [email protected]:/path/ 

hotcopy命令允许您安全地复制当前正在使用的存储库并保持一致。

解压缩从服务器上的压缩包和所有的…

我们假设在从属服务器上运行一个Web服务器,该服务器被configuration为以通常的方式提供存储库。 另外,它需要钩子脚本来防止除同步帐户之外的任何帐户提交,原因很明显,我们希望存储库完全相同。 再次如何做这是超出了这个答案的范围。

我们在主存储库上运行以下所有命令。

将主存储库绑定到从属存储库:

 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 

在以下命令中使用上面find的版本:

 svn propset svn:sync-last-merged-rev --revprop -r 0 REVISION_OF_SLAVE https://slave.example.org/repo 

我们需要使用上面find的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 

正确的地方阅读有关运行Subversion的存储库复制svnsync:

  • svnsync.txt在Subversion的回购(起点)
  • 在Paul Querna的博客中使用svnsync (如果在某个时刻出现问题)

PS – 你必须主机上有完整的master-repo镜像 ,但你可以尝试从空的repo开始,但是通过svnadmin dump克隆到某个点( 不是hotcopy!