将 SVN 存储库复制到另一个服务器存储库的子文件夹中,并带有历史记录

Posted

技术标签:

【中文标题】将 SVN 存储库复制到另一个服务器存储库的子文件夹中,并带有历史记录【英文标题】:Copy SVN repository into subfolder of another server's repository, with history 【发布时间】:2014-07-24 17:54:04 【问题描述】:

SVN 仓库 1:https://local.server.001/svn/repo1

SVN 仓库 2:https://local.server.002/svn/repo2

我们想将 repo1(从服务器 001)移动到 repo2 的 子文件夹,称为(例如)“repo1”。

也就是说repo1会被复制到这个位置:

https://local.server.002/svn/repo2/trunk/repo1

使用简单的文件副本执行此操作很简单。然而,我想要做的是实现这一点,同时保留被复制到 repo2 存储库的 repo1 文件夹中的文件的历史记录

我发现了很多在 存储库 之间或不同服务器上的存储库之间进行复制的示例,但我很难找到这种特定情况的示例。

请帮忙!谢谢。

我们都是 TortoiseSVN 用户,所以任何使用 TorsoiseSVN GUI 的答案都会是一个加分项。我们的 SVN 服务器在 VisualSVN 上运行。

编辑 - 添加漂亮的插图:

编辑 2 - 仍然无法正常工作:

在 repo 1 上运行这个:sysadmin dump C:\Repositories\repo1 > D:\dump\repo1

这行得通。将repo1 转储文件复制到服务器2。然后我运行:

svnadmin load --parent-dir repo1 C:\Repositories\repo2 < D:\someDir\repo1

我被这个错误阻止了:

Started new transaction, based on original revision 1. adding path : repo1/trunk ...svnadmin: E160013: File not found: transaction '281-96', path '/repo1/trunk'

我尝试将***文件夹 repo1 提交到 repo2 存储库,但没有成功。

【问题讨论】:

说 repo1 和 repo2 都有一个 revisionX。你不能在一个仓库中有两个单独的 revisionX,所以我认为这不能做到。也许您可以将 repo1 添加为 external。 来自 (***.com/questions/479361/…) 我发现了这个建议:svnadmin dump http://oldrepo/ > mydump svnadmin load --parent-dir my/new/folder http://newrepo/ < mydump ..--parent-dir 是关键。我很想尝试一下。我想知道这如何解决您提出的修订号冲突? (供参考:我们的 repo1 是 rev 24050。repo2 更新很多,比如 rev 3000。) How to migrate svn to another repository的可能重复 嗯,我想是可以的,见docs。 您的问题在这里得到解答***.com/questions/14795887/… 【参考方案1】:

啊哈。看来我的案例与 S/O 上其他类似案例的区别在于 我的存储库使用默认的 /branch /tags /trunk 结构

对我来说最终的顺序是:

svnadmin dump C:/Repositories/repo1 > D:/dump/repo1.dump

svndumpfilter include /trunk < D:/dump/repo1.dump > D:/dump/repo1.filtered.dump

然后我(通过 TortoiseSVN)在 repo2 存储库中创建了一个*** repo1 文件夹。

下一行对我来说失败,尽管它遵循了所有建议的示例:

svnadmin load --parent-dir /repo1 C:/Repositories/repo2 < D:/dump/repo1.filtered.dump

不好。没用。不断返回Started new transaction, based on original revision 1. adding path : repo1/trunk ...svnadmin: E160013: File not found: transaction '281-96', path '/repo1/trunk' 类型的错误。这就是我卡住的地方。我什至创建了repo1 文件夹,为什么会出现这条消息!!

..嗯,这是因为分支/标签/主干文件夹结构是 VisualSVN 的默认结构。一旦我将load 语句更改为在repo1 文件夹之前包含/trunk,这一切都奏效了:

svnadmin load --parent-dir /trunk/repo1 C:/Repositories/repo2 < D:/dump/repo1.filtered.dump

它在最高层寻找/repo1文件夹,也就是说,住在tagsbranchestrunk旁边。

(在此之后,我不得不进行 SVN 移动以将所有内容从 /trunk/repo1/trunk/* 移动到 /trunk/repo1。似乎转储/加载重新创建了我没有的“主干”文件夹不想。

【讨论】:

以上是关于将 SVN 存储库复制到另一个服务器存储库的子文件夹中,并带有历史记录的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SVN 存储库迁移到另一个 SVN 存储库?

如何将分支内容移动到另一个存储库保留历史记录并避免复制原始存储库的完整历史记录?

通过文件系统将 Gitlab 存储库复制到另一个 Gitlab 服务器

在存储库的 SVN 转储期间观察到错误 (Visual SVN)

将 SVN 存储库的一部分镜像到工作副本

将文件添加到已设置的 svn 存储库