【问题标题】:Moving SVN repositories data with history as subfolders into another repository将带有历史记录的 SVN 存储库数据作为子文件夹移动到另一个存储库中
【发布时间】:2012-07-18 18:24:26
【问题描述】:

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

【问题讨论】:

  • 这个问题很模糊。您应该澄清“在另一个存储库的子文件夹中转换每个内容的内容”是什么意思。乍一看 tt 可以是svndumpfilter 可以帮助您:visualsvn.com/support/svnbook/ref/svndumpfilter
  • 例如,我有 4 个 repos (r1,r2,r3,r4),我需要将它们全部复制到一个新的存储库 (repo-all),保留 r1,r2,r3 的历史日志,r4

标签: svn version-control repository svndump


【解决方案1】:

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

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

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

  1. 使用svnadmin dump 转储您当前的存储库,
  2. 使用svndumpfilter 过滤掉转储中仅需要的存储库路径,
  3. 使用svnadmin load 将过滤后的转储加载到另一个存储库。

您还可以使用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

假设您在此存储库中有存储库 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

就是这样!

使用svnsync 工具复制存储库

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

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

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

【讨论】:

  • Apache Subversion 常见问题解答最近更新了另一种过滤方法:subversion.apache.org/faq.html#removal
  • 第四步是在操作系统中创建目录还是使用svn mkdir创建svn目录?
【解决方案2】:

阅读您的问题后,我决定为您创建一个实用程序来解决此问题。该实用程序基于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

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2011-06-30
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多