将多个hg存储库转换为具有多个分支的单个git存储库

时间:2011-01-26 14:11:41

标签: git mercurial

我从Mercurial切换到git并且已成功使用hg-fast-export。现在我有一个棘手的情况。我有一个项目,每个分支使用单独的hg存储库,我想将它们转换为具有“正确”分支的单个git存储库,如果可能的话,保留我的hg变更集。

所以当前结构看起来像这样 - 每个文件夹都是一个hg存储库:

Project-v1.0
Project-v2.0
Project-v3.0

我想最终得到一个名为'Project'的git存储库,它包含3个分支,v1.0,v2.0和v3.0。

这可能吗?

2 个答案:

答案 0 :(得分:2)

当hg存储库是来自一个基本仓库的克隆时,您可以使用hggit扩展名将它们导出到一个git仓库中。假设您的分支位于目录b1 /,b2 /和b3 /中,那么您只需要

cd b1; mkdir ../gb1 && git init --bare ../gb1 && hg push ../gb1; cd ..
cd b2; mkdir ../gb1 && git init --bare ../gb2 && hg push ../gb2; cd ..
cd b3; mkdir ../gb1 && git init --bare ../gb3 && hg push ../gb3; cd ..
# now you have one git repo for each hg branch

cd gb1
git remote add gb2 ../gb2
git remote add gb3 ../gb3
git fetch --all
# now you have all branches in the gb1 repo
rm -r ../gb2 ../gb3
# the other repos are now not used anymore

如果不同的hg回购无关,则必须使用VonC提到的接枝点解决方案。

答案 1 :(得分:1)

这应该是可以的:

  • 从三个Mercurial创建3个不同的Git回购
  • Project-v2.0历史记录导入Project-v1.0 Git repo(将Project-v2.0添加为远程并将其提取到“v2.0”分支中:创建2个不同的根目录<登记/> 并且,通过 graft point ,将两个分支链接在一起(HEAD v1.0分支成为v2.0分支的第一个提交的父级)。
  • 使用filter-branch使这些贪污点永久(即不限于您的回购)

(对Project-v3.0重复,将第一个提取到一个单独的v3.0分支,移植到HEAD v2.0分支,并使用filter-branch进行制作移植永久性)

你有一个类似的场景(虽然它是关于“前置一些历史”而不是“追加”)在SO问题“How to prepend the past to a git repository?”中。