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

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

【问题讨论】:

标签: svn svnadmin svndump svndumpfilter


【解决方案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,也无法从远程工作副本中转储。 stackoverflow.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 仅过滤您想要使用的部分或路径。

    阅读主题:

    【讨论】:

      【解决方案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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-15
                  相关资源
                  最近更新 更多