【问题标题】:How to migrate a codebase from one svn repo to another preserving history?如何将代码库从一个 svn 存储库迁移到另一个保存历史记录?
【发布时间】:2011-02-02 04:45:22
【问题描述】:

我在结构糟糕的 svn 存储库中有一个分支,需要将其剥离并移至另一个 svn 存储库。 (我正在尝试清理一些)。

如果我执行svn log 而不是在复制/重命名时停止,我可以看到我关心的所有 3427 次提交。除了编写一些主要脚本之外,有什么方法可以将修订版转储出去吗?

我会听从this question 中的建议,但是这个分支已经到处移动了,我也想保留这些动作。

【问题讨论】:

  • 我问过类似的问题,svndumpfilter 一直是标准答案。你确定它不会为你剪掉它吗?
  • 好吧,我可以使用 svndumpfilter,但我认为我必须在转储点处至少进行 9 次路径重命名。我只是不知道是否有自动化的解决方案。 (repo 太乱了,无法使用 git-svn)。
  • 为什么不按原样导入修订版,然后在 subversion 中重命名它们?历史不需要重写?

标签: svn svnadmin svnsync svndumpfilter


【解决方案1】:

还有另一种非常简单的解决方案,可以解决“保留动作”问题。请参阅 Apache Subversion 常见问题解答条目 "How do I completely remove a file from the repository's history?" 的最后一段。该解决方案不依赖svndumpfilter

您可以执行以下步骤:

  1. 配置path-based authorization 规则以拒绝 USERNAME 帐户对您要删除的文件或文件夹的PATHS 的读取权限来自存储库历史记录。

    请注意复数名词paths。您要删除的文件或文件夹可能具有不同的名称,也可能位于存储库历史记录中的不同位置。请在设置拒绝规则时考虑这一点。

  2. 创建一个空的存储库,

  3. 使用svnsync 工具将源存储库复制到帐户USERNAME 下的目标存储库。与svnsync的仓库同步详情请参考SVNBook章节"Repository Replication"

svndumpfilter 不同,svnsync 自动将具有不可读源路径的svn copy 操作转换为正常添加,如果历史记录涉及复制操作并且仍需要过滤,这很有用。 :)

【讨论】:

    【解决方案2】:

    我想这可能类似于@ZacThompson(和@Pekka)的意思:我认为svndumpfilter 是你的朋友。

    根据您的问题,我认为您知道它的目的是什么,但是在整个地方复制/移动分支时遇到了困难?答案可以在前面提到的SVN Documentation 中找到,我相信:

    另外,复制的路径可以给你一些 麻烦。 Subversion 支持复制 存储库中的操作,其中 通过复制一些创建新路径 已经存在的路径。有可能的 在生命中的某个时刻 您的存储库,您可能已经复制了 某个位置的文件或目录 svndumpfilter 排除在外 它包含的位置。做 转储数据自给自足, svndumpfilter 仍然需要显示 添加新路径——包括 由创建的任何文件的内容 复制——并且不代表该添加 作为来自不会的来源的副本 存在于您过滤的转储数据中 溪流。但是因为颠覆 存储库转储格式仅显示什么 在每次修订中都进行了更改, 复制源的内容可能不会 随时可用。如果你怀疑 你有任何这类的副本 在您的存储库中,您可能想要 重新考虑你的包含/排除的集合 路径,可能包括路径 作为你的来源 复制操作也很麻烦。

    含义:使svndumpfilter 包含分支曾经存在过的所有 路径。还是我错过了什么?

    另一种可能性可能是@compie 在您链接的线程中提到的svndumpfilter2,尽管我认为这甚至没有必要(而且我不知道@compie 或svndumpfilter2)。

    【讨论】:

    • 我不知道 svndumpfilter2 但它似乎是我正在寻找的。我要试试看效果如何。
    • 我还没有完成我的迁移工作(巨大的 repo 30k+ 提交)但是这个方法看起来很有希望。
    【解决方案3】:

    您将需要使用以下组合:

    1. svnadmin 转储
    2. svndumpfilter
    3. svnadmin 加载

    如果你想做整个分支,你甚至可能不需要 svndumpfilter。但如果你这样做:

    http://svnbook.red-bean.com/nightly/en/svn.reposadmin.maint.html#svn.reposadmin.maint.filtering

    【讨论】:

      【解决方案4】:

      您需要使用 HotCopy 来备份存储库目录。那么它应该是简单地恢复存储库的问题。

      【讨论】:

      • 我认为他说的是从包含更多内容的存储库中剥离一个非常复杂的结构(其中包含几个动作)。
      • 您不能为此使用 hotcopy,它只能用于制作存储库的完整副本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多