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

cmb*_*hjv 9 svn version-control repository svndump

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

bah*_*rep 18

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

使用svndumpfilter工具过滤存储库历史记录

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

  1. 转储您当前的存储库svnadmin dump,
  2. 在转储中仅筛选出所需的存储库路径svndumpfilter,
  3. 使用过滤转储到另一个存储库svnadmin load.

您还可以使用svnrdump工具(存在于SVN 1.7及更高版本中)远程执行转储和加载过程.见svnrdump dumpsvnrdump load.

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

  1. 过滤存储库历史记录
  2. svnadmin dump
  3. svnadmin load
  4. svnrdump dump
  5. svnrdump load
  6. svndumpfilter

假设您在此存储库中有存储库C:\ Repositories\REPO和folder / trunk/abc.请参阅示例步骤以将folder / 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存储库中创建空/已加载文件夹.

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

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

而已!

使用svnsync工具进行存储库复制

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

该方法是在配置基于路径的授权规则后复制存储库,该svnsync规则拒绝对需要从存储库历史记录中过滤掉的任何路径的读访问权.

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