【问题标题】:Convert multiple hg repositories to single git repository with multiple branches将多个 hg 存储库转换为具有多个分支的单个 git 存储库
【发布时间】:2011-01-26 14:11:40
【问题描述】:

我正在从 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。

这可能吗?

【问题讨论】:

    标签: git mercurial


    【解决方案1】:

    当 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 repos不相关,则必须使用VonC提到的嫁接点解决方案。

    【讨论】:

      【解决方案2】:

      这应该是可能的:

      • 从三个 Mercurial 存储库中创建 3 个不同的 Git 存储库
      • Project-v2.0历史导入Project-v1.0 Git repo(通过添加Project-v2.0作为远程并在'v2.0'分支中获取它:创建了2个不同的根)
        并且,通过graft point,将两个分支链接在一起(v1.0 分支的HEAD 成为v2.0 分支的第一个提交的父级)。
      • 使用filter-branch 使这些移植点永久化(即不限于您的回购)

      (重复Project-v3.0,将第一个提取到单独的v3.0分支中,嫁接到v2.0分支的HEAD,并通过filter-branch使嫁接永久化)

      在 SO 问题“How to prepend the past to a git repository?”中有类似的场景(尽管它是关于“添加一些历史记录”,而不是“附加”)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        • 2016-03-12
        相关资源
        最近更新 更多