如何备份远程SVN仓库

52

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

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

最佳方法是什么?我能否让家庭服务器每晚获取远程服务器的转储文件?带宽不是很重要,但是如果我只能将任何新的代码提交复制到家庭服务器上的 SVN 服务器上,那也可以。

欢迎任何建议。


感谢您的快速回复。我认为SVNSync将完全符合我的要求。 Pekka - 如果我考虑到了,Serverfault可能会更好地解答这个问题。我在这里得到了如此好的快速答案,以至于我没有考虑其他网站。 再次感谢。 - Roaders
Asca'!Cazzo!使用这个命令!(开玩笑) :-) - Gianluca Ghettini
9个回答

121

只需使用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

每天同步一次,你只会得到那些尚未在备份仓库中的更改。第一次同步可能需要一些时间,但是在你的备份仓库与真实仓库同步后,同步它只需要几秒钟,因为只有新的修订版本需要同步。


5
如果可以的话,我会投两次赞成票。与在这里发布的其他答案不同,这个答案实际上是正确的。rsync:不能保证以一致的状态捕获存储库。bdb存储库在不同平台之间不具有二进制兼容性。svnadmin dump需要访问服务器。 - bendin
7
如果你在一个类UNIX的服务器上运行,请不要忘记为你的钩子脚本授予执行权限,否则它将被视为失败:chmod a+x pre-revprop-change - Tom Desp
6
在类UNIX服务器上,不要忘记在pre-revprop-change的顶部添加#!/bin/sh - Jonathan Swinney
svnsync: Path 'file:///Volumes/volumelabel/backuprepo' is not a URL - user4964330
如果你仍然看到以下错误信息:*svnsync: E165001: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.*,则很可能是执行权限不足。请执行命令:chmod +x ./backuprepo/hooks/pre-revprop-change - user3125367

24

从Subversion 1.7开始,您还可以使用新命令svnrdump。文档说明如下:

转储即生成位于SOURCE_URL的存储库项目版本的存储库转储流,并将信息打印到标准输出。

用法示例:

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

这将在repos.dump中创建一个 "dump文件",它是您的代码库数据的完整备份,包括历史记录,但不能直接被svn客户端读取。如果需要还原此数据,请使用标准的svnadmin工具:

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

我没有进行过任何测试,但这可能比svnsync慢。svnrdump每次会完全转储整个版本库,而我假设svnsync只会导入自上次运行以来版本库中的更改。然而,您将拥有包含整个仓库的单个文件,这可能更容易管理。

请注意,您可能希望通过gzip或类似程序将svnrdump的输出导入管道中,以显著减少输出文件的大小。


1
如此之快。这太完美了。 - Qix - MONICA WAS MISTREATED

12

创建本地仓库

svnadmin create /Users/jsmith/repo

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

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

将pre-revprop-change hook脚本设置为可执行

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


7

Rsync(或其在Windows上的用户界面DeltaCopy)是在文件系统级别上逐步复制完整存储库的好选择。

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


2
使用rsync的问题在于,如果您在复制存储库时有人正在进行更改,则副本可能会损坏。 svnsync比仅复制存储库更安全。 - darrickc
是的,svnsync将是首选解决方案。自从1.6版本以来,它仅受支持于SVN服务器,但现在似乎已经广泛部署。 - Wim
尽管您的答案可能还可以,但是除了@darrickc提到的锁定问题之外,还有另一个缺点:它还需要对svn存储库进行文件系统级别的访问。在大多数情况下,这是不允许的,只能使用svn://或http(s):// URL。 - peterh

2
你可以在远程服务器上使用一个脚本来导出代码库,然后将其复制到你的本地计算机(或者留在预定义的位置让你的本地计算机来复制)。
你可以使用rsyncscp来同步备份目录。
这个脚本可以通过"定时任务"运行,并且可以生成具有唯一名称的备份文件,稍后会被你的本地计算机以上述方式同步(然后可能被删除)。

2

EFraim提到了rsync,所以这个已经涵盖在内了。

如果您不想使用rsync,Subversion Book提供了svnadmin dump --incremental选项,可以在此处找到解释:

但是为了成功执行此操作,您必须管理好版本号 - rsync原始存储库数据目录将更容易。

最困难的部分可能是设置rsync,使本地和远程计算机可以安全通信(即在2003服务器上设置SSH服务)。 Wim提到的DeltaCopy非常有趣,也将是我的首选;对于仅命令行操作,这里是一篇关于如何在Windows 2003上将Rsync设置为服务的howto文章:how to get Rsync running as a service on Windows 2003


1

我会使用 svnsync 或者 svnadmin hotcopy,因为这两种技术都能够保证从仓库中复制有效的数据,即使在事务进行中。其他文件同步技术可能不太可靠,这取决于仓库的格式。


0

为了进一步解释Stefan的答案,这里提供一些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

0
在Mac OS X 10.10中,svnrdump命令位于以下位置:
  • /Library/Developer/CommandLineTools/usr/bin/svnrdump
然后,您可以使用上面joesdiner提供的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接