如何导出(然后导入)一个Subversion版本库?

我只是关于一个项目,我正在使用商业SVN提供商来存储源代码。 客户最终select的networking主机包括一个存储库作为主机包的一部分,所以,现在项目已经结束,我想将存储库重定位到他们的虚拟主机,并停止商业帐户。

我怎么去做这个?

如果要移动存储库并保留历史logging,则可能需要在两台主机上都访问文件系统。 最简单的解决scheme是,如果您的后端是FSFS(最新版本的默认设置),则将整个存储库文件夹作为文件系统副本。

如果你有一个Berkley DB后端,如果你不确定你的后端是什么,或者你正在改变SVN版本号,你将会想要使用svnadmin来转储你的旧版本库并将其加载到你的新版本库。 使用svnadmin dump会给你一个单一的文件备份,你可以复制到新的系统。 然后,您可以创build新的(空)存储库,并使用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。 或者,如果您不想保留历史logging,则可以使用您的工作副本导入到新的存储库中。 但希望情况并非如此。

rsvndump非常适合我从svnrepository.com迁移到我控制的Ubuntu服务器。

如何在Ubuntu上安装和使用rsvndump:

  1. 安装缺less的依赖项(“APR”和Subversion库)

     sudo apt-get install apache2-threaded-dev sudo apt-get install libsvn-dev 
  2. 安装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 
  3. 将远程SVN存储库转储到本地文件

     rsvndump http://my.svnrepository.com/svn/old_repo > old_repo_dump 
  4. 创build一个新的存储库并加载到本地转储文件中

     sudo svnadmin create /opt/subversion/my_new_rep sudo svnadmin load --force-uuid /opt/subversion/my_new_repo < old_repo_dump 

你也可以使用svnsync。 这只需要对源代码库进行只读访问

更在svnbook

摘自我的Blog-Note-to-myself
现在你可以导入一个转储文件,例如,如果你正在机器/颠覆版本之间迁移。 例如,如果我已经从源存储库创build转储文件并将其加载到新的存储库中,如下所示。

 CmdShell> svnadmin dump D:\CoderZone2\svn-repos > ReposDump.dmp CmdShell> svnadmin load D:\CoderZone\svn-repos < ReposDump.dmp 

这样做的工具将是

 svnadmin dump 

但为了这个工作,你需要文件系统访问存储库。 一旦你有了这个(并提供存储库是FSFS格式),您可以将存储库复制到新的位置(如果它是BDB格式,强烈build议转储/加载)。

如果您没有文件系统访问权限,则必须要求您的存储库提供者为您提供转储(并使其删除其存储库 – 并希望它们符合要求)

您也可以使用svnadmin hotcopy命令:

 svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH 

它从存储库进行完整备份,包括所有挂钩,configuration文件等。

更多在SVN书

如果您没有对存储库的文件访问权限,我宁愿使用rsvndump (远程Subversion存储库转储)来创build转储文件。

假设您拥有运行svnadmin的必要权限,则需要使用dump和load命令。

我find一篇关于如何将svn版本库从托pipe服务移动到另一个的文章,以及如何进行本地备份:

  1. 定义你将存储你的仓库的地方:

     mkdir ~/repo MYREPO=/home/me/someplace ## you should use full path here 
  2. 现在用svnadmin create $MYREPO一个空的svn仓库svnadmin create $MYREPO
  3. 创build一个钩子文件并使其可执行:

     echo '#!/bin/sh' > $MYREPO/hooks/pre-revprop-change chmod +x $MYREPO/hooks/pre-revprop-change 
  4. 现在我们可以开始使用svnsync导入存储库,它将从另一个存储库初始化一个目标存储库进行同步:

     svnsync init file://$MYREPO http://your.svn.repo.here/ 
  5. 最后一步是将所有未完成的修订从其初始化的来源转移到目的地:

     svnsync sync file://$MYREPO 

现在你在~/repo目录下有一个本地的svn仓库。

资源:

基本上,有很多方法来完成任务。 这个话题在SVNBook |深入介绍 迁移存储库数据在其他地方 ,所以我build议阅读本书的部分。

以下是您的选项的简要说明:

  • 这取决于你的环境,但是你可以简单地将资源库复制到新的服务器上,这很有可能会起作用。 复制回购库之后,您必须修改存储库挂钩脚本,以确保它们按照您的期望工作。

  • 您可以使用svnadmin dumpsvnadmin load命令来生成完整转储,然后将其加载到另一个服务器上的另一个存储库。 你将需要svnadmin create一个新的干净的存储库加载到它的转储。 请记住,该方法仅处理存储库历史logging, 不会移动挂接脚本和存储库configuration文件 ! 另外,您必须已经读取了原始存储库的文件系统访问权才能转储该文件系统。

  • 由于Subversion 1.7, svnrdump工具可用。 一般来说,它模仿svnadmin dumpsvnadmin loadfunction,但远程操作。 由于工具像Subversion客户端一样远程操作,例如通过HTTPS协议,您不需要读/写文件系统访问原始和目标存储库。 因此,您需要具有对原始存储库的读取访问权限,并可以读取/写入目标存储库。

  • 另一个select是使用svnadmin hotcopy命令。 该命令主要用于备份目的,它会创build存储库的完整副本,包括configuration和挂接脚本。 您可以将热复制的存储库移动到另一台服务器上。

您可能会在第5章“存储库pipe理”,“迁移存储库”中find一些关于迁移SVN存储库的帮助。

这种方法需要访问svnadmin。