我目前正在将我的 SVN 服务器从家庭服务器迁移到远程服务器,以便我可以更轻松地从其他位置访问它。我的远程服务器没有备份,因此我想定期备份到家庭服务器。
远程服务器是 Windows 2003 服务器。家庭服务器是 Windows Home Server。
最佳方法是什么?我能否让家庭服务器每晚获取远程服务器的转储文件?带宽不是很重要,但是如果我只能将任何新的代码提交复制到家庭服务器上的 SVN 服务器上,那也可以。
欢迎任何建议。
我目前正在将我的 SVN 服务器从家庭服务器迁移到远程服务器,以便我可以更轻松地从其他位置访问它。我的远程服务器没有备份,因此我想定期备份到家庭服务器。
远程服务器是 Windows 2003 服务器。家庭服务器是 Windows Home Server。
最佳方法是什么?我能否让家庭服务器每晚获取远程服务器的转储文件?带宽不是很重要,但是如果我只能将任何新的代码提交复制到家庭服务器上的 SVN 服务器上,那也可以。
欢迎任何建议。
只需使用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
每天同步一次,你只会得到那些尚未在备份仓库中的更改。第一次同步可能需要一些时间,但是在你的备份仓库与真实仓库同步后,同步它只需要几秒钟,因为只有新的修订版本需要同步。
chmod a+x pre-revprop-change
。 - Tom Desppre-revprop-change
的顶部添加#!/bin/sh
。 - Jonathan Swinneysvnsync: Path 'file:///Volumes/volumelabel/backuprepo' is not a URL
- user4964330chmod +x ./backuprepo/hooks/pre-revprop-change
。 - user3125367从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
的输出导入管道中,以显著减少输出文件的大小。
创建本地仓库
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
EFraim提到了rsync,所以这个已经涵盖在内了。
如果您不想使用rsync,Subversion Book提供了svnadmin dump --incremental
选项,可以在此处找到解释:
svnadmin dump --incremental
的示例但是为了成功执行此操作,您必须管理好版本号 - rsync原始存储库数据目录将更容易。
最困难的部分可能是设置rsync,使本地和远程计算机可以安全通信(即在2003服务器上设置SSH服务)。 Wim提到的DeltaCopy非常有趣,也将是我的首选;对于仅命令行操作,这里是一篇关于如何在Windows 2003上将Rsync设置为服务的howto文章:how to get Rsync running as a service on Windows 2003。
我会使用 svnsync
或者 svnadmin hotcopy
,因为这两种技术都能够保证从仓库中复制有效的数据,即使在事务进行中。其他文件同步技术可能不太可靠,这取决于仓库的格式。
为了进一步解释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
svnrdump
命令位于以下位置:
/Library/Developer/CommandLineTools/usr/bin/svnrdump