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

Posted

技术标签:

【中文标题】如何将 SVN 存储库迁移到另一个 SVN 存储库?【英文标题】:How do I migrate an SVN repository to another SVN repository? 【发布时间】:2009-06-02 14:43:26 【问题描述】:

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

【问题讨论】:

你可以检查这些问题 - How do I move a single folder from one Subversion repository to another repository? - Exporting a single project from an SVN repository - Is it possible to migrate a single file from one SVN repository to another while preserving history? - How do I dump one project out of an SVN repository which contains multiple projects? - [如何从我的 SVN 存储库中提取子树到 n 中 How do I move a single folder from one Subversion repository to another repository? 的可能副本。 【参考方案1】:

最简单的方法是使用:

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 存储库转储格式描述版本化存储库 仅更改。它不会携带任何关于未提交的信息 事务、文件系统路径、存储库或服务器上的用户锁定 配置自定义(包括挂钩脚本)等等。

【讨论】:

小心,我刚刚学到了 svnadmin dump 不包括 hooks/ 或 conf/ 的艰难方法 以防万一有人犯了我今天犯的错误,您实际上需要在 svn 机器上执行此操作。您无法签出 repo,也无法从远程工作副本中转储。 ***.com/questions/8866035/…这是为那些在偏远地区的人提供的解决方案 svnrdump dump 和 svnrdump load 允许您通过网络转储和加载存储库。 一种安全的合并方式是首先通过 tortoise 签出并添加+提交一个新文件夹。然后 svnadmin load --parent-dir newRootFolder Combining multiple repositories into one 如果我想将多个文件夹从一个存储库复制到另一个存储库怎么办?【参考方案2】:

正如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

【讨论】:

【参考方案3】:

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

对于历史记录,您需要使用svnadmin dump。然后在使用svnadmin load 之前,您将使用svndumpfilter 仅过滤您想要使用的部分或路径。

阅读主题:

Migrating Repository Data Elsewhere Filtering Repository History

【讨论】:

【参考方案4】:

使用svnsync — Subversion Repository Mirroring 命令:

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

svnsync 命令的 Subversion 文档有以下警告(从 1.7 版开始),暗示一旦使用其他一些 SVN 命令修改镜像存储库,svnsync 不应再次与该特定镜像一起使用:

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

【讨论】:

【参考方案5】:

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

请参阅svnrdump—Remote Subversion Repository Data Migration,其中有对新命令的说明。

在红皮书第 5 章中,Migrating Repository Data Elsewhere 部分有一个子部分Repository data migration using svnrdump,其中提到:

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

我还假设svnadmin dump 对服务器配置自定义(例如挂钩)的限制也适用于svnrdump

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

我觉得应该说是利用创建的转储文件

    svnadmin dump path/to/repos > dumpfile

可以使用命令创建(从 svn 1.7 开始)

   svnrdump dump url_to_repos > dumpfile

这在从远程计算机而不是服务器完成时很有用。

【讨论】:

【参考方案8】:

要将存储库从一台服务器迁移到另一个版本,您需要遵循以下步骤。

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

转储.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 步:现在使用以下脚本加载所有转储文件。

加载.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

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

【讨论】:

【参考方案9】:

如果这对其他人有帮助,可以使用 svn2svn 将变更集从一个 Subversion 存储库重播到另一个:

https://github.com/tonyduckles/svn2svn

【讨论】:

以上是关于如何将 SVN 存储库迁移到另一个 SVN 存储库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 svndump 的情况下将 svn 迁移到另一个存储库

我可以将单个文件从 CVS 迁移到 SVN 吗?

将代码从 svn 迁移到 google 代码

将 SVN 存储库复制到另一个服务器存储库的子文件夹中,并带有历史记录

将 SVN 存储库的一部分合并到另一个具有历史记录的存储库

在存储库的 SVN 转储期间观察到错误 (Visual SVN)