I have some repositories, and I need to transform the content of each one in subfolders of another repository preserving their history log... How can I do that?
2 回答
有两种方法可以完成任务。根据 Subversion 服务器分布和任务复杂性,您可能会发现其中一个比另一个更容易或更方便。
svndumpfilter
使用工具过滤存储库历史记录
该解决方案非常棘手,因为 Subversion 存储库历史过滤基于您指定的路径工作,以在 repo 转储输出中包含或排除。简而言之,您应该执行以下操作:
- 转储您当前的存储库
svnadmin dump
, - 过滤掉转储中只需要的存储库路径
svndumpfilter
, - 使用 .将过滤后的转储加载到另一个存储库
svnadmin load
。
您还可以使用svnrdump
工具(存在于 SVN 1.7 及更高版本中)远程执行转储和加载过程。见svnrdump dump
和svnrdump load
。
我强烈建议您阅读 SVNBook 中与该过程相关的以下文章:
假设您在此存储库中有存储库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
在目录中创建空的/loaded文件夹C:\Repositories\REPO2文件夹。
将转储加载到该文件夹:
svnadmin load --parent-dir /loaded C:\Repositories\REPO2 < filtered.dump
而已!
存储库复制与svnsync
使用工具
该解决方案也很棘手,但复杂的存储库过滤可能比上述方法更方便。
该方法是在配置基于路径的授权规则后复制存储库,svnsync
这些授权规则拒绝对需要从存储库历史记录中过滤掉的任何路径进行读取访问。
与, 不同svndumpfilter
,svnsync
将自动将具有不可读源路径的复制操作转换为正常添加,如果需要过滤涉及复制操作的历史记录,这很有用。
在阅读了您的问题后,我决定为您创建一个可以解决此问题的实用程序。该实用程序基于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