3

我有的

我目前有一组包含源代码的 mercurial 存储库。他们对分支使用“分叉存储库”方案。因此,功能“分支”可能如下所示:

master repo           A→B→C
                    ———————↘—————
cool_feature repo           D→E→F

一旦cool_feature准备好进入黄金时段,我们hg pull将其转换为 master ,使其看起来像这样:

master A→B→C→D→E→F

到那时,cool_feature将具有与它相同的东西,master并且可以将其丢弃。

尽管D→E→F在某些时间点位于单独的存储库中,但它们始终位于 mercurial 中的“默认”分支上。我们不使用命名分支来管理这些数据。

这在 mercurial 中运行良好,但我们正计划迁移到 git 并且 git 做的事情有点不同。当然,您仍然可以在 git 中创建 repos,但 git 分支是短暂的,因此可用于短期分支。

我想要的是

我想将其转换为单个 git 存储库,该存储库使用分支来管理仍在库存中的工作。在流程方面,我们将基本上使用“git flow”。拉取请求将在分支之间,一旦工作完成,分支将被删除。

master branch           A→B→C
                     ————————↘—————
cool_feature branch           D→E→F

我试过的

我不能简单地使用 hg's convert,因为它不理解多个存储库。事实上,整个 hg-git 生态系统中的每个工具似乎都想将 git 分支转换为 hg 分支,反之亦然。(尽管有证据表明各个社区在实践中使用它们的方式非常不同。)

一个想法是将它们拉到一个存储库中,对其进行转换,然后让 git 对其进行排序。毕竟,git 只需要标记头部。这个想法的问题是大多数工具拒绝转换多头存储库,如果他们这样做了,git 会像往常一样悄悄地丢弃未标记的头。如果有可能在事后给它们贴上标签,我还没有弄清楚。

另一个想法是,在 mercurial 中,将这些变更集移动到命名分支,并让存储库转换器完成工作。这很棘手,因为分支并不总是从一个点开始:

master repo            A→B→C→F→G→H
                     ———————↘—————↘————————
nifty_feature repo           D→E   I→J
                                \    ↓
                                 +——→K→L→M (K is a merge of E and J)

这种情况通常发生在两个开发人员一起开始一个项目时,但最终没有与他们的起点完全相同的变更集。但是没有一个点可以选择作为创建分支的“上线”。

另一个棘手的情况是当第一个修订是合并时:

master repo          A→B———→C
                        \    \
                         +→D  \
                    ————————\——↘—————————
gnarly_feature repo          +—→E→F

这里,分支的“根”是和E之间的合并。鉴于它是一个合并修订版,我还不清楚你如何将它重新设置为一个新分支。CD

由于其他原因,我已经通过 reposurgeon 运行转换,所以我可以使用一些相当精美的工具来在飞行中对其进行修改。但是每次转换都需要大约 20 个小时,因此尝试一堆不成功的东西被证明是非常昂贵的。

但似乎既然人们确实从 hg 转换为 git 并且这些都是常用的分支方案,那么肯定有人已经解决了这个问题。欢迎任何关于使用什么工具或尝试什么策略的想法。如何做到这一点?

4

1 回答 1

1

它们总是在 mercurial 的“默认”分支上。我们不使用命名分支来管理这些数据

这是一个大错误:您可以同时使用命名分支+单独克隆

我想将其转换为单个 git 存储库,该存储库使用分支来管理仍在库存中的工作

可能是大错误 2(方向/从 Hg 到 Git/ 和方法论/single repo/)

整个 hg-git 生态系统中的每个工具似乎都希望将 git 分支转换为 hg 分支,反之亦然。

只是错了。我手里有 Git-repo,用 hg-git 和一组 Git-branches克隆。在 Mercurial 方面,我(如预期的那样)有一个分支

>hg branches
default                     5266:1ffe854c93c1

和 Git 分支,以 hg 书签的形式呈现(它们确实如此)

>hg book
   1.6                       2344:fc32e948fcba
   1.7                       5140:1c58e9bfa3d5
   2.0                       5219:683d072d02b6
   feature_dbpluginapi       4986:a855a635e17f
   feature_indexCleanup      5207:7ec7ee38ef2f
   feature_preview           4806:d40ade50b113
   feature_updateAll         4807:97ea12fea917
   master                    4620:de0053588acf

我不能简单地使用 hg 的转换,因为它不理解多个存储库

但是您必须将它用于每个存储库的转换:

  • --branchmap使用选项将每个功能存储库转换为中间 Mercurial-repo (将default分支重命名为另一个...功能名称?)
  • 将转换后的仓库拉入主仓库;您必须获得完整的历史记录,与旧的相同,但有一个例外:所有功能开发都将出现在唯一命名的分支中
  • 使用 hg-git 或Git-Hg 桥将聚合的 repo 推送到 Git
于 2015-10-30T19:24:22.937 回答