如何备份远程SVN存储库

时间:2010-02-20 15:07:46

标签: svn backup

我目前正将SVN服务器从家用服务器移动到远程服务器,以便我可以更轻松地从其他位置访问它。 我的远程服务器没有备份,所以我想定期备份到我的家庭服务器。

远程服务器是Windows 2003服务器。家庭服务器是Windows Home Server。

最好的方法是什么?我可以让我的家庭服务器每晚都能获得远程服务器的转储吗?带宽不是一个重要的考虑因素,但如果我可以将任何新的签到复制到我的家庭服务器上的SVN服务器,那就没问题了。

欢迎任何建议。

9 个答案:

答案 0 :(得分:115)

只需使用svnsync命令。

首先,在您的家庭计算机上创建一个新的存储库。

svnadmin create c:\backuprepo

或者在Unix上:

svnadmin create ./backuprepo

接下来,创建一个名为pre-revprop-change.bat的文件:

echo exit 0 > c:\backuprepo\hooks\pre-revprop-change.bat

或者在Unix上:

echo -ne '#!/bin/sh\nexit 0' > ./backuprepo/hooks/pre-revprop-change
chmod ugo+x ./backuprepo/hooks/pre-revprop-change 

然后,初始化同步:

svnsync init file:///c:/backuprepo https://url/of/your/repository

或者在Unix上:

svnsync init file:///Volumes/volumelabel/backuprepo https://url/of/your/repository

之后,您只需运行

即可
svnsync sync file:///c:/backuprepo

每天一次左右,您将只获得备份存储库中尚未存在的更改。第一次需要一段时间,但在您将备份存储库与真实存储库同步后,只需几秒钟就可以同步它,因为只需要同步那些新版本的修订版。

答案 1 :(得分:16)

从subversion 1.7开始,您还可以使用新命令svnrdump。来自文档:

  

转储 - 也就是说,生成位于SOURCE_URL的存储库项目的存储库转储流,将信息打印到标准输出。

用法是:

svnrdump dump http://example.com/repos/ > repos.dump

这将在repos.dump中创建存储库的“转储文件”。这是包含历史记录的存储库数据的完整备份,但不能由subversion客户端直接读取。如果您需要恢复此数据,请使用标准svnadmin工具:

svnadmin create c:\backup-repos
svnadmin load c:\backup-repose < repos.dump

尚未进行任何测试,但最终可能会慢于svnsyncsvnrdump每次都会完全转储存储库,我假设synsync只会导致自上次运行以来存储库中的更改。您将拥有一个包含整个存储库的文件,这可能会也可能不会更容易管理。

请注意,您可能希望管道svnrdumpgzip或类似程序的输出,以显着减小输出文件的大小。

答案 2 :(得分:11)

创建本地存储库

svnadmin create /Users/jsmith/repo

创建一个空的pre-revprop-change钩子脚本

echo '#!/bin/bash' > /Users/jsmith/repo/hooks/pre-revprop-change

使pre-revprop-change钩子脚本可执行

chmod +x /Users/jsmith/backup/hooks/pre-revprop-change

初始化svnsync

svnsync init file:////Users/jsmith/repo https://www.smith.com/repo

同步回购

svnsync sync file:////Users/jsmith/repo

答案 3 :(得分:7)

rsync(或DeltaCopy,它是一个Windows用户界面)是在文件系统级别逐步复制完整存储库的不错选择。

您还可以使用svnsync将新版本直接从一台SVN服务器复制到另一台SVN服务器。

答案 4 :(得分:2)

您可以在转储存储库的远程服务器上使用脚本,然后将其复制到本地计算机(或将其保留在本地计算机的预定义位置以进行复制)

您可以将备份目录与rsyncscp同步。

该脚本可以使用“计划任务”运行,并且可以生成唯一命名的备份文件,稍后将通过本地计算机以上述方式同步。 (然后可能删除)

答案 5 :(得分:2)

EFraim在我写这篇文章的时候提到了rsync,所以它被覆盖了。

如果你不想使用它,Subversion Book提供了这里解释的svnadmin dump --incremental选项:

但是,要成功完成此操作,您必须使用修订号码 - rsync'将更容易使用原始存储库数据目录。

困难的部分可能是设置rsync,因此您的本地和远程计算机可以安全地通信(即在2003服务器上设置SSH服务)。 Wim提到的DeltaCopy非常有趣,是我的第一枪;仅用于命令行操作,这是how to get Rsync running as a service on Windows 2003上的一个方法。

答案 6 :(得分:1)

我会使用svnsyncsvnadmin hotcopy,因为这两种技术都可以保证从存储库中复制有效数据,即使事务正在进行中。其他文件同步技术可能不那么可靠,具体取决于存储库格式。

答案 7 :(得分:0)

在Mac OS X 10.10中,svnrdump命令位于此处:

  • /Library/Developer/CommandLineTools/usr/bin/svnrdump

然后,您可以使用joesdiner上面的答案。

答案 8 :(得分:0)

为进一步说明Stefans的答案,以下是一些Windows批处理脚本,以帮助实现该过程的自动化。

svn-backup-init.bat

@echo off
set /P directory="Local Directory: "
set /P URL="Svn URL: "

echo "Running SVN backup";

@echo on
svnadmin create %directory%
echo exit 0 > %directory%\hooks\pre-revprop-change.bat
svnsync init file:///%directory% %URL%
svnsync sync file:///%directory%**strong text**

此脚本将创建svn存储库,并将其检出并立即进行同步。运行脚本时,只需输入将存储库本地放置的目录和要使用的服务器的URL。

svn-backup-run.bat

for /d %%i in (%~dp0*) do ( svnsync sync file:///%%i ) 

这将循环遍历每个目录并运行svnsync命令。如果您有多个存储库,请将它们检出到同一文件夹中。然后可以轻松地将其添加为Windows中的“任务”,以一次更新所有存储库。

文件夹结构

我使用这样的文件夹结构:

.
├── svn-backups
|   ├── repo-1
|   ├── repo-2
|   ├── repo-3
|   ├── svn-backup-init.bat
|   └── svn-backup-run.bat