使用子目录分支进行迁移

时间:2012-08-31 13:00:25

标签: svn mercurial

我正在尝试将SVN存储库转换为Mercurial。几百个版本之前,一个分支是从trunk的子目录(而不是整个trunk)制作的。

trunk
  * subdir
  * ...
branches
  * foo (forked from subdir)
  * ... (other branches fork from trunk)
tags
  * ...

我尝试使用convert扩展转换存储库,但是foo导致了问题。它显示在已转换的存储库中,而不是来自主干的分支,而是来自名为“subdir”的新分支。 subdir分支与trunk相似,对trunk进行的任何更改都在subdir上重复。

以下是转换后存储库的简略视图:

  .
  .
  |
  *  202  foo      Created foo branch
. |
. *  201  subdir   Added XYZ
| |
* .  200  default  Added XYZ
| .
. .
. |
. *    4  subdir   Fixed DEF
| |
* |    3  default  Fixed DEF
| |
| *    2  subdir   Added ABC
|  
*      1  default  Added ABC

而不是:

  .
  .
. |
. *  101  foo      Created foo branch
|/
*    100  default  Added XYZ
|
.
.
.
|
*      2  default  Fixed DEF
|  
*      1  default  Added ABC

如何修复存储库(转换前或转换后)以使分支与第二个图匹配?

1 个答案:

答案 0 :(得分:0)

转换后方式

您有两项任务:

  • 从子分支
  • 中删除重复修订
  • 更改foo branch的第一个实际变更集的父级

您可以使用不同的方法在“subdir”

中删除202之前的变更集
  • MQ(2个版本)
    • 将变更集转换为mq-patches,取消应用所有补丁,删除补丁
    • 将变更集转换为mq-patches,取消应用所有补丁,将存储库克隆到new,永久使用new
  • Histedit扩展(与TortoiseHG捆绑) - 启用,使用,删除所有错误提交

将foo分支链接到右父

hg rebase -s 202 -d 200(根据您的第一张图表,使用哈希或书签/添加/将更好,更防弹)。 “subdir”的孤立变更集将在hg clone -r tip

之后消失