代码之家  ›  专栏  ›  技术社区  ›  Pedro

合并git repositores

  •  1
  • Pedro  · 技术社区  · 7 年前

    我有三个GIT存储库:

    • 报告1
    • 报告2
    • 报告3

    我想把它们统一成一个单一的回购协议,就像这样:

    mainRepo/Repo1

    mainRepo/Repo2

    mainRepo/Repo3

    其中,每个旧存储库都是新存储库的子文件夹。这个 mainRepo 是一个新的存储库,内部没有任何内容。

    1 回复  |  直到 7 年前
        1
  •  2
  •   ephemient    7 年前

    这将保存历史( git log --follow ).

    mkdir mainRepo
    cd mainRepo
    git init
    
    git remote add repo1 (path to repo1.git)
    git remote add repo2 (path to repo2.git)
    git remote add repo3 (path to repo3.git)
    git remote update
    
    repo1_commit=$(
        git commit-tree "$(
            printf '040000 tree %s\t%s\0' "$(git rev-parse repo1/master^{tree})" repo1 \
            | git mktree -z
        )" -p repo1/master -m 'Move repo1 to subdirectory')
    repo2_commit=$(
        git commit-tree "$(
            printf '040000 tree %s\t%s\0' "$(git rev-parse repo2/master^{tree})" repo2 \
            | git mktree -z
        )" -p repo2/master -m 'Move repo2 to subdirectory')
    repo3_commit=$(
        git commit-tree "$(
            printf '040000 tree %s\t%s\0' "$(git rev-parse repo3/master^{tree})" repo3 \
            | git mktree -z
        )" -p repo3/master -m 'Move repo3 to subdirectory')
    
    git reset --hard "$(
        git commit-tree "$(
            printf '040000 tree %s\t%s\0' \
                "$(git rev-parse repo1/master^{tree})" repo1 \
                "$(git rev-parse repo2/master^{tree})" repo2 \
                "$(git rev-parse repo3/master^{tree})" repo3 \
            | git mktree -z
        )" \
        -p "${repo1_commit}" -p "${repo2_commit}" -p "${repo3_commit}" \
        -m 'Merge repo1, repo2, and repo3')"