5

我有两个 Mercurial 存储库,它们用于同一项目的不同主要版本。后一个版本是对项目的功能,尤其是 UI的巨大改变,但它仍然会与早期版本有很多共同的代码。(简而言之,我将这些版本4.65.0存储库称为project-4.xproject-5.x;这基本上就是我正在处理的内容。)[1]

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

$ hg pull -f project-5.x   # in project-4.x
$ hg merge

到目前为止,一切都很好。我关心的是处理分支问题。[2] 这些将作为两个完全不相关的链出现(这很好),但我希望分支结构看起来像这样:

---4.6-----   }
  \           } original project-4.x
   5.0-----   }
       /
-------       } original project-5.x

问题是,我不确定该怎么做

编辑:见下文;我设计的答案奏效了。


脚注

  1. 如果您想知道为什么这只是现在才出现……好吧,该项目仅在开始时才获得版本控制4.6。是的,这有点疯狂。而且我以前从未负责过像这样的主要版本更改,所以我最初决定完全制作一个新的 repo,我现在当然后悔了。活到老,学到老。
  2. 我已经阅读过关于这个主题的答案(但这让我不确定如何准确地做到这一点):
4

1 回答 1

5

我最初认为我需要一些方法来拉入分支,但在仔细研究之后,我总结出最好的方法大致如下:

  1. 创建所需的新分支结构(即创建4.65.0分支)。
  2. 将旧default分支删除到4.6基础存储库中的分支中。
  3. project-5.x存储库拉入project-4.x存储库。
  4. 将在合并期间拉入的default(或在此存储库的情况下)基线合并到分支中,沿途关闭分支。experimental5.0experimental
  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"

此时,存储库已设置:它具有新的基线分支并删除了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"

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

于 2013-05-08T01:50:07.047 回答