如何导出(然后导入)Subversion存储库?

时间:2008-09-08 10:50:40

标签: svn

我刚刚结束了一个项目,我正在使用商业SVN提供程序来存储源代码。客户最终选择的Web主机包括作为托管包的一部分的存储库,因此,现在项目已经结束,我想将存储库重新定位到他们的Web主机并停止使用商业帐户。

我将如何做到这一点?

11 个答案:

答案 0 :(得分:63)

如果要移动存储库并保留历史记录,则可能需要在两台主机上进行文件系统访问。最简单的解决方案是,如果你的后端是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。或者,如果您不想保留历史记录,则可以使用工作副本导入新存储库。但希望事实并非如此。

答案 1 :(得分:33)

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

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

  1. 安装缺少的依赖项(“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. 创建新存储库并加载本地转储文件

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

答案 2 :(得分:9)

您也可以使用svnsync。这只需要源存储库上的只读访问权限

more at svnbook

答案 3 :(得分:6)

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

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

答案 4 :(得分:5)

这样做的工具是

svnadmin dump

但要使其工作,您需要对存储库进行文件系统访问。一旦你拥有了(并且存储库是FSFS格式),你可以将存储库复制到新的位置(如果它是BDB格式,强烈建议使用转储/加载)。

如果您没有文件系统访问权限,则必须要求您的存储库提供商为您提供转储(并让他们删除他们的存储库 - 并希望他们遵守)

答案 5 :(得分:5)

如果您没有对存储库的文件访问权限,我更喜欢rsvndump(远程Subversion存储库转储)来生成转储文件。

答案 6 :(得分:4)

您还可以使用svnadmin hotcopy命令:

svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH

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

More at SVN Book

答案 7 :(得分:4)

基本上,有很多方法可以完成任务。这个主题在SVNBook | Migrating Repository Data Elsewhere中有详细介绍,所以我建议你阅读本书的部分。

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

  • 这取决于您的环境,但很有可能您只需将存储库复制到新服务器即可。复制repo后,必须修改存储库钩子脚本,以确保它们按预期工作。

  • 您可以使用svnadmin dumpsvnadmin load命令生成完全转储,然后将其加载到另一台服务器上的另一个存储库。您需要svnadmin create一个新的干净存储库来将转储加载到其中。请记住,该方法仅处理存储库历史记录,不会移动钩子脚本和存储库配置文件!同样,您必须具有对原始存储库的读取文件系统访问权限才能将其转储。

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

  • 另一种选择是使用svnadmin hotcopy命令。该命令主要用于备份目的,它创建存储库的完整副本,包括配置和钩子脚本。您可以将hotcopied存储库移动到另一台服务器。

答案 8 :(得分:3)

假设您具有运行svnadmin所需的权限,则需要使用dumpload命令。

答案 9 :(得分:3)

我发现了一篇关于如何将svn存储库从托管服务移动到另一个服务器以及如何进行本地备份的文章:

  1. 定义存储库的位置:

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

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

    svnsync init file://$MYREPO http://your.svn.repo.here/
    
  6. 最后一步,将所有待定修订版本从初始化的来源转移到目的地:

    svnsync sync file://$MYREPO
    
  7. 现在,您在~/repo目录中有一个本地svn存储库。

    来源:

答案 10 :(得分:2)

您可以在 Chapter 5. Repository Administration, Migrating a repository 中找到有关迁移SVN存储库的帮助。

此方法需要访问svnadmin。