将具有历史记录的SVN存储库数据作为子文件夹移动到另一个存储库中

时间:2012-07-19 14:29:05

标签: svn version-control repository svndump

我有一些存储库,我需要在另一个存储库的子文件夹中转换每个存储库的内容保留其历史记录日志 ...我该怎么做?

2 个答案:

答案 0 :(得分:18)

有两种方法可以完成任务。根据Subversion服务器分布和任务复杂性,您可能会发现其中一个比另一个更容易或更方便。

使用svndumpfilter工具

过滤存储库历史记录

解决方案非常棘手,因为Subversion存储库历史记录过滤基于您指定在repo转储输出中包含或排除的路径。简而言之,您应该执行以下操作:

  1. 使用svnadmin dump
  2. 转储您当前的存储库
  3. 使用svndumpfilter
  4. 过滤掉转储中所需的存储库路径
  5. 使用svnadmin load将已过滤的转储装入另一个存储库。
  6. 您还可以使用svnrdump工具(存在于SVN 1.7及更高版本中)远程执行转储和加载过程。请参阅svnrdump dumpsvnrdump load

    我强烈建议您阅读SVNBook中与该过程相关的以下文章:

    1. Filtering Repository History
    2. svnadmin dump
    3. svnadmin load
    4. svnrdump dump
    5. svnrdump load
    6. svndumpfilter
    7. 假设您在此存储库中有存储库 C:\ Repositories \ REPO 和文件夹 / trunk / abc 。请参阅示例步骤以将文件夹 / trunk / abc 移动到另一个存储库 C:\ Repositories \ REPO2

      1. 确保所有影响 / trunk / abc 路径及其后代的提交不会影响任何其他路径。例如,没有提交将文件同时添加到 / trunk / abc / another_folder 或从 / another_folder 复制文件到 / trunk / abc

      2. 创建REPO存储库的转储:

        svnadmin dump C:\Repositories\REPO > REPO.dump

      3. 从REPO.dump文件中过滤掉不必要的路径:

        svndumpfilter include /trunk/ABC < REPO.dump > filtered.dump

      4. C:\ Repositories \ REPO2 存储库中创建空 / loaded 文件夹。

      5. 将转储装载到该文件夹​​:

        svnadmin load --parent-dir /loaded C:\Repositories\REPO2 < filtered.dump

      6. 就是这样!

        使用svnsync工具

        进行存储库复制

        解决方案也很棘手,但是复杂的存储库过滤可能比上述方法更方便。

        在配置replicate the repository with svnsync规则后,方法是path-based authorization,拒绝对需要从存储库历史记录中过滤掉的任何路径的读取权限。

        svndumpfilter不同,svnsync会自动将具有不可读源路径的复制操作转换为正常添加,如果需要过滤涉及复制操作的历史记录,这将非常有用。 < / p>

答案 1 :(得分:1)

在阅读完问题后,我决定为您创建一个可以解决此问题的实用程序。该实用程序基于SVNKit库,位于此处 https://sourceforge.net/projects/svnkitfilter

跑步

$ svnadmin create svn.repo
$ svnkitfilter SRC_URL_1 file:///path/to/svn.svn --prefix prefix/for/repository1
$ svnkitfilter SRC_URL_2 file:///path/to/svn.svn --prefix prefix/for/repository2
...
$ svnkitfilter SRC_URL_N file:///path/to/svn.svn --prefix prefix/for/repositoryN