Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一组mercurial存储库转换为git存储库? 我所拥有的_Git_Version Control_Mercurial_Reposurgeon - Fatal编程技术网

如何将一组mercurial存储库转换为git存储库? 我所拥有的

如何将一组mercurial存储库转换为git存储库? 我所拥有的,git,version-control,mercurial,reposurgeon,Git,Version Control,Mercurial,Reposurgeon,我目前有一组mercurial存储库,其中包含源代码。他们对分支使用“分叉存储库”方案。因此,功能“分支”可能如下所示: master repo A→B→C ———————↘————— cool_feature repo D→E→F master A→B→C→D→E→F 一旦cool\u功能准备好进入黄金时段,我们将hg将其拉入master,使其看起来像这样: master repo A→B→

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

master repo           A→B→C
                    ———————↘—————
cool_feature repo           D→E→F
master A→B→C→D→E→F
一旦
cool\u功能
准备好进入黄金时段,我们将
hg将其拉入master,使其看起来像这样:

master repo           A→B→C
                    ———————↘—————
cool_feature repo           D→E→F
master A→B→C→D→E→F
此时,
cool\u功能
将具有与
master
相同的内容,可以将其丢弃

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

这在mercurial中运行得很好,但我们正计划迁移到git,git的工作方式略有不同。当然,您仍然可以在git中进行回购,但git分支是短暂的,因此可用于短期分支

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

master branch           A→B→C
                     ————————↘—————
cool_feature branch           D→E→F
我试过的 我不能简单地使用hg的
convert
,因为它不理解多个存储库。事实上,整个HgGit生态系统中的每个工具似乎都想将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
之间的合并。考虑到这是一个合并修订版,我现在还不清楚如何将其重设为一个新分支

出于其他原因,我已经通过Repo外科医生运行了转换,因此我可以使用一些相当奇特的工具在运行中对其进行修改。但每次转换都需要约20个小时,因此,尝试一系列无法成功的事情被证明是非常昂贵的

但似乎由于人们确实从hg转换到git,而且这些都是常用的分支方案,所以肯定有人解决了这个问题。欢迎提供任何关于使用何种工具或尝试何种策略的想法。如何做到这一点

它们始终位于mercurial中的“默认”分支上。我们不使用命名分支来管理此数据

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

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

这可能是一个大错误2(方向/从Hg到Git/和方法/单一回购/)

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

完全错了。我手上有Git回购协议,用hg Git和。在Mercurial这一方,我有(如预期的)一个分支

>hg branches
default                     5266:1ffe854c93c1
和Git分支,以hg书签的形式呈现(它们实际上是)

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

但您有将其用于每个存储库的转换:

  • 使用(将分支重命名为另一个…功能名称?)将每个功能回购转换为中间Mercurial回购
  • 将转换后的回购转换为主回购;您必须获得与旧版本相同的完整历史记录,但有一个例外:所有功能开发都将出现在唯一命名的分支中
  • 使用hg Git或

顺便说一句,我无法想象在现实生活中的
漂亮的功能
粗糙的功能
回购协议,但这两个都是我实际回购协议中特定分支的现实问题。还有另一个病理病例:多个头部。但git无法处理这一点,所以我必须确保这些分支合并或拆分,使它们每个都只有一个头。单一回购中的分支-好(可能),用奇怪的根分开分支-不是多个头-一旦我使用
convert
重命名default,就为
default
的每个头添加书签,我将有100%的新变更集。即使主回购协议中存在的变更集也将被转换。拉操作将使我拥有历史记录中每个变更集的两个副本,一个是默认副本,一个是特性分支副本。