我有的
我目前有一组包含源代码的 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
之间的合并。鉴于它是一个合并修订版,我还不清楚你如何将它重新设置为一个新分支。C
D
由于其他原因,我已经通过 reposurgeon 运行转换,所以我可以使用一些相当精美的工具来在飞行中对其进行修改。但是每次转换都需要大约 20 个小时,因此尝试一堆不成功的东西被证明是非常昂贵的。
但似乎既然人们确实从 hg 转换为 git 并且这些都是常用的分支方案,那么肯定有人已经解决了这个问题。欢迎任何关于使用什么工具或尝试什么策略的想法。如何做到这一点?