如何将SVN存储库中的子树提取到新的子树中?

如何将SVN存储库中的子树提取到新的子树中?,svn,system-administration,Svn,System Administration,我们有一个Subversion存储库,其中有一个目录: 除了RCS的能力之外,并不真正需要修订控制 未与存储库中的任何其他内容一起进行版本控制 修改频率大约是存储库其余部分的六倍 虽然我知道高版本号不是问题,但我还是想把这个目录从我的主存储库中拉出来,放到第二个目录中,最好是新目录 这方面的最佳流程是什么?如果有区别,SVN存储库将托管在(…检查…)FreeBSD机器上 值得注意的是,虽然我需要在新存储库中保留版本历史记录,但没有必要删除旧存储库中的内容;不管我怎么说,它可以放在那里。我会导

我们有一个Subversion存储库,其中有一个目录:

  • 除了RCS的能力之外,并不真正需要修订控制
  • 未与存储库中的任何其他内容一起进行版本控制
  • 修改频率大约是存储库其余部分的六倍
虽然我知道高版本号不是问题,但我还是想把这个目录从我的主存储库中拉出来,放到第二个目录中,最好是新目录

这方面的最佳流程是什么?如果有区别,SVN存储库将托管在(…检查…)FreeBSD机器上

值得注意的是,虽然我需要在新存储库中保留版本历史记录,但没有必要删除旧存储库中的内容;不管我怎么说,它可以放在那里。

我会导出(而不是签出)目录,将其导入到新的存储库中,然后从原始存储库中删除它(当然,会有一条日志消息指示它去了哪里;-)

这可能是最好的方法,也可能不是最好的方法…

您可以使用svnadmin dump和svnadmin load从原始存储库创建一个新的存储库;然后将不适合您的方案的目录复制到更好的位置,然后删除所有其他内容。在原始存储库中,您只需删除非fitting目录。这会保持所有历史的完整性,最终会得到两个存储库


可能有一种方法可以随后从历史中无用的部分清除这两个存储库(svndumpfilter),但由于硬盘空间非常便宜,我认为没有必要这样做。不管怎么说,我们已经掌握了所有相关信息。

我不知道我是否正确理解了这一点,但有一个很好的解决方案。如果您的原始存储库位于svn://domain,而您经常使用的文件夹称为“folder”,我相信您可以简单地执行以下命令:
svncosvn://domain/folder
仅签出该文件夹。

建议使用
svnadmin dump
,然后使用
svndumpfilter
工具过滤转储文件(请参阅)

例如,我有一个名为“Model”的顶级目录的回购协议,我想将其移动到自己的回购协议:

svnadmin dump my_orig_repo | svndumpfilter include --drop-empty-revs --renumber-revs Model >model_only.svndump
svnadmin load my_model_repo < model_only.svndump
svnadmin dump my_orig_repo | svndumpfilter包括--删除空转数--重新编号转数Model>Model_only.svndump
svnadmin加载我的\u模型\u回购
只使用Model子目录创建新的repo

要将其从原始存储库中删除,只需执行
svn rm
。这将从最新版本的回购协议中删除它,这是最简单的方法


但是,如果我的示例中的模型目录非常大,可能我希望将其完全从原始目录中删除。我可以通过重复这个过程来创建另一个过滤的svn转储文件,并将其排除在外。然后,我将用没有排除目录的新目录替换原始目录。

例如,没有历史记录。对不起,那是不可能的。我当时不知道你想保存历史:-/不用担心,这不明显。我已经修正了这个问题。还有更新的(SVN v.1.7)
svnrdump