如何将SVN存储库迁移到另一个SVN存储库?

时间:2009-06-02 14:43:27

标签: svn svnadmin svndump svndumpfilter

是否有一种简单的方法可以将目录从一个存储库复制到另一个存储库并复制所有历史记录?

9 个答案:

答案 0 :(得分:76)

最简单的方法是使用:

svnadmin dump path/to/repos > repos.out

这将为文件repos.out中的存储库(带历史记录)创建可移植格式。然后你可以使用

svnadmin load path/to/newrepos < repos.out

将“转储”存储库加载到新的或现有存储库。

Chapter 5. Repository Maintenance -> Migrating Repository Data Elsewhere有关于从版本1.7开始使用svnadmin dump的说明:

  

Subversion存储库转储格式描述了版本化存储库   仅改变。它不会携带有关未提交的任何信息   事务,用户锁定文件系统路径,存储库或服务器   配置自定义(包括钩子脚本)等。

答案 1 :(得分:34)

正如Subversion book

中所述
svnadmin dump path/to/repos_src \
    | svndumpfilter include path/inside/svn/to/directory \
    | svnadmin load path/to/repos_dst

举个例子:

svnadmin dump /var/lib/svn/old_repo \
    | svndumpfilter include trunk/my_project/common_dir \
    | svnadmin load /var/lib/svn/new_repo

答案 2 :(得分:24)

如果您不想要历史记录,可以使用svn export获取一个没有.svn文件夹的干净文件夹,然后svn import到另一个存储库。

根据历史记录,您需要使用svnadmin dump。然后,您可以使用svndumpfilter在使用svnadmin load之前仅过滤您要使用的部分或路径。

阅读主题:

答案 3 :(得分:9)

使用svnsync — Subversion Repository Mirroring命令:

  

svnsync是Subversion远程存储库镜像工具。简而言之,它允许您将一个存储库的修订版重放到另一个存储库中。

svnsync命令的Subversion文档具有以下警告(从版本1.7开始),这意味着一旦使用其他一些SVN命令修改镜像存储库,svnsync就不应该使用{}特别镜子:

  

svnsync对镜像存储库中所做的更改非常敏感   这些都不是镜像操作的一部分。为了防止这种情况   发生这种情况时,最好是svnsync进程是唯一的进程   允许修改镜像存储库。

答案 4 :(得分:5)

在Subversion版本1.7中,有一个新命令svnrdump,可用于访问远程存储库并生成与svnadmin dump命令生成的转储格式相同的转储格式。这允许您使用svnrdumpsvnadmin load来传输Subversion存储库。

请参阅svnrdump—Remote Subversion Repository Data Migration,其中包含对新命令的解释。

在红皮书的第5章中,Migrating Repository Data Elsewhere部分有一个子部分使用svnrdump 的存储库数据迁移,提及:

  

svnrdumpsvnadmin dump之间的主要区别是   而不是要求直接访问存储库,svnrdump   使用完全相同的存储库访问(RA)远程操作   Subversion客户端执行的协议。因此,您可能需要   提供身份验证凭据另外,你的远程互动   [原文如此]受到任何授权限制的约束   Subversion服务器。

我还假设svnadmin dump有关服务器配置自定义(如挂钩)的限制可能无法转移,也适用于svnrdump

答案 5 :(得分:4)

您可以使用svnadmin dump创建转储文件,然后导入到svnadmin load的新存储库。

答案 6 :(得分:3)

我认为应该声明使用

创建的转储文件
    svnadmin dump path/to/repos > dumpfile
可以使用命令

创建

(从svn 1.7开始)

   svnrdump dump url_to_repos > dumpfile

从远程计算机而非服务器完成此操作时非常有用。

答案 7 :(得分:1)

如果这有助于其他人,有svn2svn可以将变更集从一个Subversion存储库重放到另一个:

https://github.com/tonyduckles/svn2svn

答案 8 :(得分:-2)

要将存储库从一个服务器迁移到另一个版本,请执行以下步骤。

步骤1:将所有存储库版本转储到转储文件中。您可能在现有存储库中拥有数千个版本。因此,您可以使用以下脚本创建转储文件。

dump.sh

# Here “i” is the version starting number, and “j” is the maximum version number of your existing #repository.
j=4999;
for ((i=0;i<=$j;i++));
do
   # your-unix-command-here
   echo $i
   svnadmin dump <old_server_repository_location > -r $i  –incremental > <dump_location>/$i.dump
done

在上面的脚本中,您可能会根据空间可用性获得旧存储库的完整转储,或者您可以在短时间内(即0-5000,然后从5001-10000等)获取转储。

步骤2:使用以下命令执行上述脚本。根据内核版本,您需要执行以下两个查询之一。

$ bash dump.sh > stdout.sh
$ ./sh dump.sh > stdout.sh

这将使用上述命令将您必须执行的所有命令写入stdout.sh文件。您可以跟踪此文件以供将来参考。

步骤3:检查旧服务器和新服务器之间的端口号22的防火墙是否打开。如果没有打开,请让管理员提供此功能。

步骤4:现在使用以下命令将从旧SVN存储库生成的所有转储文件复制到新服务器。

$ sftp xxxx@<new_server>
Connecting to <new_server>…
Password:
sftp> mput *.dump <new_server>/dump_location

在上面的命令中,xxxx是正在执行操作的用户。在执行sftp的过程中,您将转储文件从旧服务器复制到新服务器。

步骤5:为新服务器创建新存储库

$ svnadmin create <new_repository>

步骤6:现在使用以下脚本加载所有转储文件。

load.sh

# Here “i” is the version starting number, and “j” is the maximum version number of your existing #repository.
j=4999;
for ((i=0;i<=$j;i++));
do
   # your-unix-command-here
   echo $i
   svnadmin load –bypass-prop-validation <new_repository> < dump_location /$i.dump
done

只需按照上述六个简单步骤,您就可以将现有存储库迁移到新存储库。通过此过程,您无需担心现有存储库的损坏修订。