如何通过hg转换将git分支导入mercurial?

Dav*_*idM 17 git mercurial branch

我在git存储库中有许多分支:

david@Panama ~/app: git branch -r  
origin/HEAD -> origin/master
origin/master
origin/newButtons
origin/newFonts
origin/serverView
Run Code Online (Sandbox Code Playgroud)

如果我尝试将这个git repo导入mercurial:

david@Panama ~/: hg convert app
...
david@Panama ~/app-hg: hg update
388 files updated, 0 files merged, 0 files removed, 0 files unresolved
david@Panama ~/app-hg: hg branches
default                     1148:6d04af619607
Run Code Online (Sandbox Code Playgroud)

似乎分支已经"丢失"(就它们不再分离而言)并且确实合并到了提示中:

david@Panama ~/app-hg: hg log
changeset:   1148:6d04af619607
tag:         tip
user:        convert-repo
date:        Mon Nov 16 17:57:06 2009 +0000
summary:     update tags

changeset:   1147:742e7a01a6c9
parent:      1144:bff259181b22
user:        user1
date:        Sat Nov 14 17:47:09 2009 +0000
summary:     Playing around with fonts to get a cleaner look

changeset:   1146:162c1b0dd648
parent:      1144:bff259181b22
user:        user1
date:        Fri Nov 13 21:12:21 2009 +0000
summary:     Playing with new server view

changeset:   1145:aa06857832ab
user:        user1
date:        Sat Nov 14 13:54:12 2009 +0000
summary:     Updated buttons to something more fitting

changeset:   1144:bff259181b22
user:        David Mytton <david@mytton.net>
date:        Fri Nov 13 10:35:51 2009 +0000
summary:     Example
Run Code Online (Sandbox Code Playgroud)

鉴于这种情况:

a)我在这里导入分支是否有问题?

b)分支机构实际上可以进口吗?

Von*_*onC 21

这是设计的.导入的Git分支仅在Mercurial中标记,并且hg heads应该为您提供正确数量的导入"分支".

正如这个帖子中提到的:

考虑一个如下所示的树:

        o-o-o-o-o-o-b <- branch foo
       /
 -o-o-a
       \
        o-o-c <- branch bar
Run Code Online (Sandbox Code Playgroud)

什么分支是"a"及其祖先?
我们没有丝毫的线索.事实上,我们唯一确定的变更集是b nd c,因为分支名称不是历史记录的一部分.

所以:

事实证明,实际上这是不可能的,因为git不能存储足够的信息.
考虑一个在git中有两个分支的repo,每个分支都有许多提交.
因为git不记录每个提交源自哪个分支,所以树中没有足够的信息来标记每个变更集.
一个git用户可以交换两个分支的名称,并且没有记录任何内容来说它是不同的.如果两个分支有一个共同的祖先(他们几乎肯定会),那个祖先是什么分支?我们不知道.

在一般情况下,我们能做的最好的事情是将每个分支头标记为在该分支上.然后,如果你进行增量转换,我们可能会做正确的事情.但是git的分支概念并不是与hg的完美匹配,所以这种转换也不是完美的.


你可以用一个小的Git repo(Git 1.6.5.1,Hg1.3.1)来测试它:

PS C:\Prog\Git\tests> cd .\hgimport
PS C:\Prog\Git\tests\hgimport> git init gitRepoToImport
PS C:\Prog\Git\tests\hgimport> cd .\gitRepoToImport
PS [...]\gitRepoToImport> echo firstContentToBr1 > br1.txt
PS [...]\gitRepoToImport> echo firstContentToBr2 > br2.txt
PS [...]\gitRepoToImport> echo firstContentToBr3 > br3.txt
PS [...]\gitRepoToImport> git add -A
PS [...]\gitRepoToImport> git commit -a -m "first content, to be evolved in three different branches"
Run Code Online (Sandbox Code Playgroud)

在三个独立的分支中进行一系列修改:

PS [...]\gitRepoToImport> git checkout -b br1
PS [...]\gitRepoToImport> echo firstEvolutionInBr1 >> .\br1.txt
PS [...]\gitRepoToImport> git commit -a -m "first evolution in branch 1"
PS [...]\gitRepoToImport> echo secondEvolutionInBr1 >> .\br1.txt
PS [...]\gitRepoToImport> git commit -a -m "second evolution in branch 1"
PS [...]\gitRepoToImport> git checkout master
PS [...]\gitRepoToImport> git checkout -b br2
PS [...]\gitRepoToImport> echo firstEvolutionInBr1 >> .\br2.txt
PS [...]\gitRepoToImport> git commit -a -m "first evolution in branch 2"
PS [...]\gitRepoToImport> git checkout master
PS [...]\gitRepoToImport> git checkout -b br3
PS [...]\gitRepoToImport> echo firstEvolutionInBr3 >> .\br3.txt
PS [...]\gitRepoToImport> git commit -a -m "first evolution in branch 3"
PS [...]\gitRepoToImport> echo secondEvolutionInBr3 >> .\br3.txt
PS [...]\gitRepoToImport> git commit -a -m "second evolution in branch 3"
PS [...]\gitRepoToImport> echo thirdEvolutionInBr3 >> .\br3.txt
PS [...]\gitRepoToImport> git commit -a -m "third evolution in branch 3"
PS [...]\gitRepoToImport> git checkout br2
PS [...]\gitRepoToImport> echo secondEvolutionInBr2 >> .\br2.txt
PS [...]\gitRepoToImport> git commit -a -m "second evolution in branch 2"
PS [...]\gitRepoToImport> git checkout br1
PS [...]\gitRepoToImport> echo thirdEvolutionInBr3 >> .\br1.txt
PS [...]\gitRepoToImport> git commit -a -m "third evolution in branch 1"
PS [...]\gitRepoToImport> git checkout br2
PS [...]\gitRepoToImport> echo thirdEvolutionInBr3 >> .\br2.txt
PS [...]\gitRepoToImport> git commit -a -m "third evolution in branch 2"
Run Code Online (Sandbox Code Playgroud)

然后克隆那个Git repo(以防万一,对于男性其他测试)

PS [...]\gitRepoToImport> cd ..
PS C:\Prog\Git\tests\hgimport> git clone .\gitRepoToImport gitRepoToImport1
Run Code Online (Sandbox Code Playgroud)

~/.hgrc使用没有BOM格式UTF-8 配置您(花了一些时间才能正确使用!)

[extensions]
hgext.convert = 
Run Code Online (Sandbox Code Playgroud)

然后进行转换

PS C:\Prog\Git\tests\hgimport> hg convert .\gitRepoToImport1 hgRepo
PS C:\Prog\Git\tests\hgimport> cd .\hgRepo
PS C:\Prog\Git\tests\hgimport\hgRepo> hg heads
Run Code Online (Sandbox Code Playgroud)

你会得到三个预期的"分支"

changeset:   9:ad0884395ada
tag:         tip
user:        VonC
date:        Mon Nov 16 21:45:35 2009 +0100
summary:     third evolution in branch 2

changeset:   6:854bc6537c7c
user:        VonC
date:        Mon Nov 16 21:45:19 2009 +0100
summary:     third evolution in branch 1

changeset:   3:9194cf25d3ca
user:        VonC
date:        Mon Nov 16 21:44:09 2009 +0100
summary:     third evolution in branch 3
Run Code Online (Sandbox Code Playgroud)

  • 在DVCS术语中,术语"分支"过于过载.如果我们有一些商定的语言来轻松区分各种含义(例如图形叉,标记的头,标记的修订版),那将是很好的. (6认同)