我从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。
这可能吗?
答案 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)
这应该是可以的:
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?”中。