Mercurial合并存储库作为分支

Chr*_*cho 4 versioning mercurial repository branching-and-merging

我有两个Mercurial存储库,用于同一项目的不同主要版本.后一版本对项目的功能,尤其是UI进行了大量更改,但它仍然会在早期版本中包含许多常用代码.(为了简化,我会称这些版本4.65.0存储库项目-4.xproject-5.x继续进行;这基本上就是我正在处理的事情.)[1]

当我们更仔细地考虑我们的存储库的结构,并特别考虑如何处理相关代码时,很明显我们想简单地将存储库拉到一起并使用命名分支来处理每个存储库中的正在进行的工作(人们可以从中分支或书签并根据需要合并).为此,我们决定基本上需要将project-5.x存储库拉project-4.x存储库.从我所看到的,组合存储库应该相当简单:

$ hg pull -f project-5.x   # in project-4.x
$ hg merge
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我担心的是处理分支问题.[2] 这些将作为两个完全不相关的链(这很好),但我希望分支结构看起来像这样:

---4.6-----   }
  \           } original project-4.x
   5.0-----   }
       /
-------       } original project-5.x
Run Code Online (Sandbox Code Playgroud)

问题是,我不能确切地知道如何做到这一点.

编辑:见下文; 我设计的答案有效.


脚注

  1. 如果你想知道为什么现在才出现......好吧,该项目在启动时只能进行版本控制4.6.哪,是的,有点疯狂.我之前从未负责过像这样的重大版本更改,所以我最初决定完全重新制作一个回购,我当然后悔了.活到老,学到老.
  2. 答案我已经阅读过这个主题(但是这让我不确定如何做到这一点):

Chr*_*cho 5

我原本以为我需要一些方法才能进入分支机构,但在咀嚼之后,我得出结论,最好的方法大致如下:

  1. 创建所需的新分支结构(即创建4.65.0分支).
  2. 将旧default分支删除到4.6基本存储库中的分支.
  3. project-5.x存储库拉project-4.x存储库.
  4. 将合并期间拉入的基线default(或在此存储库的情况下experimental)合并到5.0分支中,experimental沿途关闭分支.
  5. 限制对旧存储库的中央推/拉位置的写访问权限; 我们仍然有历史原因,但人们不能无意中推动它.

准备(步骤1-2)

$ cd <project-4.x directory>
$ hg branch 4.6
$ hg ci -m "New 4.0 baseline"
$ hg branch 5.0
$ hg ci -m "New 5.0 baseline"
$ hg up default
$ hg ci --close-branch -m "Close default branch going forward.
$ hg up 4.6
$ hg merge default
$ hg ci -m "branch merge default -> 4.6"
Run Code Online (Sandbox Code Playgroud)

此时,存储库已设置:它具有新的基线分支,并删除了default我们想要删除的旧分支.

在此之后,我进行了更改以使存储库结构看起来更像是project-4.x存储库中5.0分支所需的方式(因为大规模重组是版本更改工作的一部分).

存储库合并(步骤3-4)

下一步实际上是合并在一起的存储库,推动从旧库的内容转换成所需的分支.

$ hg pull -f <path to project-5.x repository>   # still in project-4.x repository
$ hg merge -m "Merge in project-5.x repository"
$ hg up experimental   # experimental is the name of the "default" branch
$ hg ci --close-branch -m "Close experimental branch"
$ hg up 5.0
$ hg merge experimental
$ hg ci -m "Merge old experimental into new 5.0 baseline"
Run Code Online (Sandbox Code Playgroud)

这完美地进行,没有任何合并冲突(除了我需要解决我的.hgignore文件中的一些小差异).