【问题标题】:Create svn repository from existing module, keeping history从现有模块创建 svn 存储库,保留历史记录
【发布时间】:2016-03-09 04:04:36
【问题描述】:

我有一个SVN下的遗留项目,组织如下:

Legacy-Repository/trunk/
  |- module1
  |- module2
  |- ...
  '- moduleN

这个遗留设计不符合我们的需求,我需要为每个模块创建一个SVN存储库,同时保留每个模块的历史)以获得以下结构:

New-Repository1/trunk/ (content of module1's directory)
New-Repository2/trunk/ (content of module2's directory)
...
New-RepositoryN/trunk/ (content of moduleN's directory)

在此迁移之后,存储库“Legacy-Repository”将被归档。 “Legacy-Repository/trunk/”中不在模块中的内容不重要,不需要迁移。

实现此目的的(最佳)方法是什么(使用 svn 命令行)?

提前感谢您的帮助。

注意:我使用的是 svn 1.7.14。

【问题讨论】:

  • /trunk/moduleXXX 是 LEGACY 中模块根目录的路径吗(从您的图表中看不出来)?
  • 是的。所有模块都在“主干”中

标签: svn


【解决方案1】:

针对亚历克斯回答的不足之处

  • svnrdump dump URL/TO/Module 而不是 svnadnin dump | svndumpfilter include 是 1) 更短 2) 不需要完全访问服务器
  • svnadmin load 不会也不能更改还原转储的路径,只能使用 --parent-dir 选项将“挂载点”更改为自定义位置,因此:树,转储为 trunk/ModuleN 将在还原到新单独回购的根目录后出现也作为trunk/ModuleN,而不是按要求/

完善的解决方案和想法

  • 使用svnrdump dump 转储每个子树(更快,更少浪费的空间)
  • 如果“脏”历史不会让您烦恼 - 不要在将转储加载到新存储库后立即忘记(不要忘记至少 --ignore-uuid 选项,以防止在所有新存储库之间共享 UUID)svn mv主干/ModuleN 到 /
  • 如果您想要干净的历史记录 - 您可以尝试在加载之前“破解”转储(在 repo 中获取正确的路径),使用 SVN-DumpRelocperl-script(未测试)

【讨论】:

  • 感谢您的回答。我会尝试这样做,并会给你一个反馈。
  • svnrdump 工作正常,但是,SVN-DumpReloc 不能按原样使用。事实上,它依赖于转储流格式 v2,而我使用的 svnrdump 版本会产生 v3 转储。我必须找到另一种方法来“重新定位”代码(可能 sed 应该可以完成这项工作)
  • @kraal - 从代码中删除版本检查或将 $head =~ /^SVN-fs-dump-format-version:\s*2\s*$/ 中的版本替换为 3
  • 我面临另一个问题:当我执行svnrdump dump https://.../branches/MyBranch/module1/ > module1.dump 然后执行grep -a Node-path module1.dump 时,我看到转储包含节点路径为.../MyBranch/module2/ 的文件,换句话说似乎没有将转储限制在我指定的目录(svnrdump 版本:1.7.14)
  • @kraal - 仅当 您在某些修订版中的 两个模块 中接触了文件:没有提到的工具会拆分修订版,因为修订版是原子操作,而不是每个文件|目录操作
【解决方案2】:

我认为最好的方法是使用svndumpfilter 命令。

基本上,您需要转储整个存储库(使用svnadmin dump 命令)并过滤转储以为每个模块生成一个转储。然后,您可以使用 svnadmin load 将每个转储加载到新的 SVN 存储库中。

这是svndumpfilter 的示例(fullSvnDump.dmp 是完整的存储库转储):

svndumpfilter include trunk/module1 --drop-empty-revs --renumber-revs < fullSvnDump.dmp > module1.dmp 2> svndump.log &

【讨论】:

  • 感谢您的回答。有人对你投了反对票,但没有解释也没有替代解决方案......:-/
  • @LazyBadger 我可以对你的评论说同样的话......你有更好的方法来回答@kraal 的问题吗?您是否知道我实际上已经使用此解决方案来完成 OP 所要求的几乎所有操作,并且效果很好。我的帖子可能更完整,有svnadmin dumpsvnadmin load 的例子,但是这些命令的使用非常简单(命令名+repo URL)......这并不是一种真正友好的方式来迎接新的贡献者...... .
  • @AlexRNL - Je ne suis pas louis d'or d'être aimé par tout le monde
  • 已经尝试过这种生成转储的方法,它可以工作,但是svnrdump确实更简单。关于加载部分,@lazy badger 的方法还需要 svnadmin 命令才能使用 --ignore-uuid。总而言之,我认为没有充分的理由拒绝这个答案(因此我给了它+1)......虽然不是最好的,但它很有用。
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多