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

标签 svn version-control repository svndump

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

最佳答案

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

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

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

  • 使用svnadmin dump
  • 来转储当前存储库
  • 使用svndumpfilter
  • 过滤出转储中仅需要的存储库路径
  • 使用svnadmin load将过滤的转储加载到另一个存储库。

  • 您还可以使用 svnrdump 工具(在SVN 1.7和更高版本中存在)来远程执行转储和加载过程。参见 svnrdump dump svnrdump load

    我强烈建议您阅读SVNBook中与该过程相关的以下文章:
  • Filtering Repository History
  • svnadmin dump
  • svnadmin load
  • svnrdump dump
  • svnrdump load
  • svndumpfilter

  • 假设您在此存储库中有存储库C:\Repositories\REPO和文件夹/trunk/abc。请参见将文件夹/trunk/abc移至另一个存储库C:\Repositories\REPO2的示例步骤。
  • 确保影响/trunk/abc路径及其后代的所有提交均不影响任何其他路径。例如,没有提交可同时将文件添加到/trunk/abc和/another_folder或将文件从/another_folder复制到/trunk/abc等的提交。
  • 创建REPO存储库的转储:
    svnadmin dump C:\Repositories\REPO > REPO.dump
  • 从REPO.dump文件中过滤掉不必要的路径:
    svndumpfilter include /trunk/ABC < REPO.dump > filtered.dump
  • 在C:\Repositories\REPO2存储库中创建一个空的/loaded文件夹。
  • 将转储加载到该文件夹​​:
    svnadmin load --parent-dir /loaded C:\Repositories\REPO2 < filtered.dump

  • 就是这样!

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

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

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

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

    关于svn - 将具有历史记录的SVN存储库数据作为子文件夹移动到另一个存储库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11563031/

    相关文章:

    SVN 日志文件和 TortoiseSVN

    version-control - 从明文库迁移到 Mercurial 库

    repository - 使用 Git 时如何避免代码中使用绝对路径名?

    eclipse - Subversive 和 Eclipse - 提交后,它仍然显示传出的更改

    git - 哪个版本控制允许文件级别的访问权限?

    svn - Crystal 报表+SVN合并分支

    git status -> 显示将在子目录中添加(暂存)的文件

    version-control - 从 TFS : VersionSpec. 最新版本规范合并无法按预期工作

    maven - 将Gradle从1.12升级到2.14后找不到快照依赖项

    javascript - Breeze JS为什么要为每个工作单元创建一个新的entityManagerProvider?