合并 git 个存储库

Merge git repositores

我有三个 GIT 存储库:

我想将它们统一到一个单一的仓库中,就像这样:

mainRepo/Repo1

mainRepo/Repo2

mainRepo/Repo3

其中每个旧存储库都是新存储库的子文件夹。 mainRepo 是一个新的存储库,里面没有任何东西。

旧的存储库将被删除,因此无需保留远程,我需要保留文件历史记录。我试过用子树和手动合并,但没有成功。

这将保留历史记录 (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[=10=]' "$(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[=10=]' "$(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[=10=]' "$(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[=10=]' \
            "$(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')"