我目前正将SVN服务器从家用服务器移动到远程服务器,以便我可以更轻松地从其他位置访问它。 我的远程服务器没有备份,所以我想定期备份到我的家庭服务器。
远程服务器是Windows 2003服务器。家庭服务器是Windows Home Server。
最好的方法是什么?我可以让我的家庭服务器每晚都能获得远程服务器的转储吗?带宽不是一个重要的考虑因素,但如果我可以将任何新的签到复制到我的家庭服务器上的SVN服务器,那就没问题了。
欢迎任何建议。
答案 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
尚未进行任何测试,但最终可能会慢于svnsync
。 svnrdump
每次都会完全转储存储库,我假设synsync
只会导致自上次运行以来存储库中的更改。您将拥有一个包含整个存储库的文件,这可能会也可能不会更容易管理。
请注意,您可能希望管道svnrdump
到gzip
或类似程序的输出,以显着减小输出文件的大小。
答案 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)
答案 4 :(得分:2)
您可以在转储存储库的远程服务器上使用脚本,然后将其复制到本地计算机(或将其保留在本地计算机的预定义位置以进行复制)
该脚本可以使用“计划任务”运行,并且可以生成唯一命名的备份文件,稍后将通过本地计算机以上述方式同步。 (然后可能删除)
答案 5 :(得分:2)
EFraim在我写这篇文章的时候提到了rsync,所以它被覆盖了。
如果你不想使用它,Subversion Book提供了这里解释的svnadmin dump --incremental
选项:
svnadmin dump --incremental
但是,要成功完成此操作,您必须使用修订号码 - rsync'将更容易使用原始存储库数据目录。
困难的部分可能是设置rsync,因此您的本地和远程计算机可以安全地通信(即在2003服务器上设置SSH服务)。 Wim提到的DeltaCopy非常有趣,是我的第一枪;仅用于命令行操作,这是how to get Rsync running as a service on Windows 2003上的一个方法。
答案 6 :(得分:1)
我会使用svnsync
或svnadmin 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