从现有模块创建svn存储库,保留历史记录

从现有模块创建svn存储库,保留历史记录,svn,Svn,我在SVN下有一个遗产项目,组织如下: Legacy-Repository/trunk/ |- module1 |- module2 |- ... '- moduleN 这种传统设计不符合我们的需要,我需要为每个模块创建一个SVN存储库,同时保留每个模块的历史记录),以获得以下结构: New-Repository1/trunk/ (content of module1's directory) New-Repository2/trunk/ (content of module2

我在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/trunk/”中不在模块中的内容并不重要,不需要迁移

实现这一点(使用svn命令行)的(最佳)方法是什么

提前感谢你的帮助


注意:我使用的是SVN1.7.14

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

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

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

svndumpfilter包括中继线/模块1——删除空转数——重新编号转数module1.dmp 2>svndump.log&

对亚历克斯答案的不足提出质疑

  • svnrdump dump URL/TO/Module
    而不是
    svnadnin dump | svndumpfilter include
    较短1)不需要完全访问服务器
  • svnadmin load
    不会也不能更改还原转储的路径,只能使用
    --parent dir
    选项将“装载点”更改为自定义位置,因此:在还原到新的单独repo根目录后,转储为
    trunk/ModuleN
    的树也将显示为
    trunk/ModuleN
    ,而不是请求的
完善的解决方案和想法

  • 使用
    svnrdump Dump
    转储每个子树(更快、更少浪费空间)
  • 如果“脏”历史记录没有让您烦恼-在将转储加载到新存储库后不要立即忘记(至少不要忘记
    --忽略uuid
    选项,以防止在所有新回购之间共享uuid)
    svn mv
    中继/模块到/
  • 如果您想要干净的历史记录,您可以尝试在加载之前使用perl脚本(未经测试)对转储进行“破解”(在repo中获得正确的路径)

谢谢您的回答。有人否决了你,但没有任何解释,也没有其他解决办法……:-/@懒虫我可以对你的评论说同样的话。。。你有更好的方法回答@kraal的问题吗?你知道吗,我实际上用这个解决方案做了很多事情,而且效果很好。我的帖子可能更完整,有
svnadmin dump
svnadmin load
的例子,但是这些命令的使用非常简单(命令名+repo URL)。。。这不是一个友好的方式来迎接新的贡献者…@ Alne ReNLL JE Ne Suas Pas路易斯D'O'Tr.AIM Apple Tead Toul Le MunDeDead尝试了这种方法来产生转储,它是有效的,但是SvnRDIP确实更简单。关于加载部分,@lazy獾的方法还需要svnadmin命令才能使用--ignore uuid。总的来说,我认为没有理由对这个答案投反对票(因此我给它一个+1)。。。虽然不是最好的,但它很有用。
/trunk/moduleXXX
是遗留模块根目录的路径吗(不是图表中的obvoius)?是的。所有模块都在“主干”中,谢谢您的回答。我会尝试这样做,并会给你一个反馈。svnrdump工作正常,但SVN DumpReloc无法正常使用。事实上,它依赖于转储流格式v2,我使用的svnrdump版本生成v3转储。我必须找到另一种方法来“重新定位”代码(可能sed应该做这项工作)@kraal-从代码中删除版本检查或将
$head=~/^SVN fs dump格式中的版本替换为3版本:\s*2\s*$/
我面临另一个问题:当我执行
svnrdump转储时https://.../branches/MyBranch/module1/ >module1.dump
,然后执行
grep-节点路径module1.dump
,我看到转储包含的文件的节点路径是
../MyBranch/module2/
,换句话说,它似乎没有将转储限制到我指定的目录(svnrdump version:1.7.14)@kraal-只有在某些修订中触及了两个模块中的文件时:没有提到的工具拆分修订,因为修订是原子操作,不是每个文件|目录操作
svndumpfilter include trunk/module1 --drop-empty-revs --renumber-revs < fullSvnDump.dmp > module1.dmp 2> svndump.log &