繁体   English   中英

如何将一组mercurial存储库转换为git存储库?

[英]How do I convert a set of mercurial repositories into a git repository?

我有的

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

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

一旦cool_feature准备好黄金时间,我们hg pullhg pull入主机,这样它将如下所示:

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

那时, cool_feature将拥有与master相同的东西,它可以被丢弃。

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

这在mercurial中效果很好,但是我们计划转向git并且git做的事情有点不同。 当然,你仍然可以在git中使用fork repos,但是git branch是短暂的,因此可用于短期分支。

我想要的是

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

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

我试过的

我不能简单地使用hg的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

这里,分支的“根”是ECD之间的合并。 鉴于它是一个合并修订版,我并不是很清楚你如何将它重新定义到一个新的分支。

由于其他原因,我已经通过reposurgeon运行转换,所以我可以访问一些相当奇特的工具来在飞行中修改它。 但是每次转换需要大约20个小时,所以尝试一堆没有成功的东西已经证明是非常昂贵的。

但似乎因为人们确实从hg转换为git并且这些都是常用的分支方案,所以有人在那里肯定解决了这个问题。 有关使用什么工具或尝试什么策略的任何想法都是受欢迎的。 如何实现这一目标?

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

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

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

它可能是大误差2(方向/从Hg到Git /和方法/单回购/)

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

错了。 我手里拿着Git-repo,用一组Git-branches克隆了hg-git。 在Mercurial方面,我(如预期)有一个分支

>hg branches
default                     5266:1ffe854c93c1

和Git-branches,作为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选项将每个feature-repo转换为中间Mercurial-repo(将default分支重命名为另一个... feature-name?)
  • 将转换后的仓库转换为主仓库; 您必须获得完整的历史记录,与旧的相同,但有一个例外:所有功能开发都将出现在唯一的命名分支中
  • 使用hg-git或Git-Hg桥将聚合回购推送到Git

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM