我即将结束一个使用商业SVN提供程序存储源代码的项目。客户最终选择的Web主机将一个存储库作为托管软件包的一部分,因此,既然项目结束了,我想将存储库重新定位到其Web主机并终止商业帐户。
我将如何去做呢?
Answers:
如果要移动存储库并保留历史记录,则可能需要在两个主机上都具有文件系统访问权限。如果您的后端是FSFS(最新版本中的默认设置),则最简单的解决方案是制作整个存储库文件夹的文件系统副本。
如果您有Berkley DB后端,或者不确定后端是什么,或者您要更改SVN版本号,则需要使用svnadmin来转储旧存储库并将其加载到新存储库中资料库。使用svnadmin dump
将为您提供单个文件备份,您可以将其复制到新系统。然后,您可以创建新的(空)存储库并使用svnadmin load
,该存储库实质上将重播所有提交及其元数据(作者,时间戳等)。
您可以在此处阅读有关转储/加载过程的更多信息:
http://svnbook.red-bean.com/en/1.8/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate
另外,如果您这样做了svnadmin load
,请确保使用该--force-uuid
选项,否则人们在切换到新存储库时会遇到问题。Subversion使用UUID在内部标识存储库,它不允许您将工作副本切换到其他存储库。
如果您没有文件系统访问权限,则可能还有其他第三方选项(或您可以写一些东西)来帮助您迁移:本质上,您必须使用svn日志在新存储库中重播每个修订,并且然后修正元数据。您需要适当的pre-revprop-change和post-revprop-change钩子脚本来执行此操作,这些脚本假定文件系统具有访问权限,因此是YMMV。或者,如果您不想保留历史记录,则可以使用工作副本导入新的存储库。但是希望事实并非如此。
rsvndump
对我来说,将存储库从svnrepository.com迁移到我控制的Ubuntu服务器非常有用。
安装缺少的依赖项(“ APR”和Subversion库)
sudo apt-get install apache2-threaded-dev
sudo apt-get install libsvn-dev
安装rsvndump
wget http://prdownloads.sourceforge.net/rsvndump/rsvndump-0.5.5.tar.gz
tar xvfz rsvndump-0.5.5.tar.gz
cd rsvndump-0.5.5
./configure
make
sudo make install
将远程SVN存储库转储到本地文件
rsvndump http://my.svnrepository.com/svn/old_repo > old_repo_dump
创建一个新的存储库并加载到本地转储文件中
sudo svnadmin create /opt/subversion/my_new_rep
sudo svnadmin load --force-uuid /opt/subversion/my_new_repo < old_repo_dump
svn switch --relocate http://my.svnrepository.com/svn/old_repo http://newserver.com/svn/my_new_repo
您也可以使用svnsync。这仅需要对源存储库进行只读访问
摘自我的博客笔记:
现在,您可以导入转储文件,例如,如果要在计算机/ Subversion版本之间进行迁移。例如,如果我已经从源存储库创建了转储文件并将其加载到新存储库中,如下所示。
类似Unix的系统的命令(从终端):
svnadmin dump /path/to/your/old/repo > backup.dump
svnadmin load /path/to/your/new/repo < backup.dump.dmp
用于Microsoft Windows系统的命令(从cmd shell):
svnadmin dump C:\path\to\your\old\repo > backup.dump
svnadmin load C:\path\to\your\old\repo < backup.dump
基本上,有很多方法可以完成任务。该主题在SVNBook中有详细介绍。在其他地方迁移存储库数据,因此建议阅读本书的部分。
这是您的选择的简要说明:
这取决于您的环境,但是很有可能您可以将存储库简单地复制到新服务器上,它就可以工作。复制存储库后,您必须修改存储库挂钩脚本,以确保它们按预期工作。
您可以使用svnadmin dump
和svnadmin load
命令,生成完整的转储,然后将其加载到另一台服务器上的另一个存储库中。您将需要svnadmin create
一个新的干净存储库以将转储加载到其中。请记住,该方法仅处理存储库历史记录,并且不会移动挂钩脚本和存储库配置文件!同样,您必须具有对原始存储库的读取文件系统访问权限才能将其转储。
从Subversion 1.7开始,该svnrdump
工具可用。一般来说,它模仿svnadmin dump
并svnadmin load
具有功能,但可以远程操作。您不需要对原始存储库和目标存储库具有读/写文件系统访问权限,因为该工具可以像Subversion客户端一样远程运行,例如通过HTTPS协议。因此,您需要对原始存储库具有读取权限,并且需要对目标存储库进行读/写操作。
另一种选择是使用svnadmin hotcopy
命令。该命令主要用于备份目的,它创建存储库的完整副本,包括配置和挂钩脚本。然后,您可以将热复制的存储库移至另一台服务器。
您还可以使用以下svnadmin hotcopy
命令:
svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH
它从存储库中进行完整备份,包括所有挂钩,配置文件等。
我找到了一篇有关如何将svn存储库从托管服务移至另一服务以及如何进行本地备份的文章:
定义存储存储库的位置:
mkdir ~/repo
MYREPO=/home/me/someplace ## you should use full path here
svnadmin create $MYREPO
创建一个挂钩文件并使它可执行:
echo '#!/bin/sh' > $MYREPO/hooks/pre-revprop-change
chmod +x $MYREPO/hooks/pre-revprop-change
现在,我们可以使用导入存储库svnsync
,这将初始化目标存储库以与另一个存储库进行同步:
svnsync init file://$MYREPO http://your.svn.repo.here/
最后的一笔整理工作是将所有待处理的修订版本从初始化时的来源转移到目标位置:
svnsync sync file://$MYREPO
现在,您在~/repo
目录中具有本地svn存储库。
资源:
svnrdump dump https//remote/svn/trunk > repos.dump
。在大多数情况下,该命令也可与SVN 1.6一起使用,但可能会出现一些问题,请参阅docs。在* nix和Windows中均可使用。