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


82

我即将结束一个使用商业SVN提供程序存储源代码的项目。客户最终选择的Web主机将一个存储库作为托管软件包的一部分,因此,既然项目结束了,我想将存储库重新定位到其Web主机并终止商业帐户。

我将如何去做呢?

Answers:


69

如果要移动存储库并保留历史记录,则可能需要在两个主机上都具有文件系统访问权限。如果您的后端是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。或者,如果您不想保留历史记录,则可以使用工作副本导入新的存储库。但是希望事实并非如此。


28
从1.7开始,您现在可以svnrdump,它不需要远程仓库上的管理员权限。命令很简单:svnrdump dump https//remote/svn/trunk > repos.dump。在大多数情况下,该命令也可与SVN 1.6一起使用,但可能会出现一些问题,请参阅docs。在* nix和Windows中均可使用。
亚伯2012年

34

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
    

7
然后,要迁移现有的工作副本: svn switch --relocate http://my.svnrepository.com/svn/old_repo http://newserver.com/svn/my_new_repo
tkdave 2011年

force-uuid选项到底是什么?它是否从源或其他源复制目录权限?
Montag451

1
UUID是存储库的“通用唯一标识符”。除非UUID匹配,否则您无法切换到重新定位的存储库。注意,稍后也可以使用svnadmin setuuid命令设置UUID。
tkdave 2014年


9

摘自我的博客笔记

现在,您可以导入转储文件,例如,如果要在计算机/ 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

5

做到这一点的工具是

svnadmin dump

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

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


5

如果您没有对该存储库的文件访问权限,则我希望使用rsvndump(远程Subversion存储库转储)来制作转储文件。


我今天很辛苦地得知,新的svns认为旧存储库已损坏。使用转储解决了这个问题。
猫头鹰

4

基本上,有很多方法可以完成任务。该主题在SVNBook中有详细介绍。在其他地方迁移存储库数据,因此建议阅读本书的部分。

这是您的选择的简要说明:

  • 这取决于您的环境,但是很有可能您可以将存储库简单地复制到新服务器上,它就可以工作。复制存储库后,您必须修改存储库挂钩脚本,以确保它们按预期工作。

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

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

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


4

您还可以使用以下svnadmin hotcopy命令:

svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH

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

SVN Book上的更多内容


1
实际上,它是svnADMIN热拷贝。这意味着,这也将需要存储库文件系统访问!
pilif


3

我找到了一篇有关如何将svn存储库从托管服务移至另一服务以及如何进行本地备份的文章:

  1. 定义存储存储库的位置:

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

    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存储库。

资源:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.