我有一些存储库,我需要在另一个存储库的子文件夹中转换每个存储库的内容保留其历史记录日志 ...我该怎么做?
答案 0 :(得分:18)
有两种方法可以完成任务。根据Subversion服务器分布和任务复杂性,您可能会发现其中一个比另一个更容易或更方便。
svndumpfilter
工具解决方案非常棘手,因为Subversion存储库历史记录过滤基于您指定在repo转储输出中包含或排除的路径。简而言之,您应该执行以下操作:
svnadmin dump
,svndumpfilter
,svnadmin load
将已过滤的转储装入另一个存储库。您还可以使用svnrdump
工具(存在于SVN 1.7及更高版本中)远程执行转储和加载过程。请参阅svnrdump dump
和svnrdump load
。
我强烈建议您阅读SVNBook中与该过程相关的以下文章:
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
会自动将具有不可读源路径的复制操作转换为正常添加,如果需要过滤涉及复制操作的历史记录,这将非常有用。 < / p>
答案 1 :(得分:1)
在阅读完问题后,我决定为您创建一个可以解决此问题的实用程序。该实用程序基于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