Слияние репозиториев git

У меня есть три репозитория GIT:

  • Репо1
  • Репо2
  • Репо3

и я хочу объединить их в одно репо, например:

mainRepo/Repo1

mainRepo/Repo2

mainRepo/Repo3

где каждый старый репозиторий является подпапкой нового. mainRepo — это новый репозиторий, внутри которого ничего нет.

Старые репозитории будут удалены, поэтому нет необходимости держать пульт, и мне нужно сохранить историю файлов. Я пытался сделать это с поддеревом и слиянием вручную, но не удалось.


person Pedro    schedule 13.11.2017    source источник
comment
Сделайте резервную копию файлов, прежде чем пытаться это сделать. Буквально скопируйте и вставьте файлы в нужную структуру. Убедитесь, что вы скопировали скрытые папки .git и .gitignore. Перейдите в родительский каталог mainRepo и запустите репозиторий git.   -  person S. Walker    schedule 13.11.2017
comment
@S.Walker, это создаст подмодули, которые не будут работать, когда мои старые репозитории будут удалены, верно?   -  person Pedro    schedule 13.11.2017
comment
У Git нет имеет историю файлов. У Git есть коммиты, а коммиты являются историей. Вы либо сохраняете старые коммиты (и, следовательно, старую историю), либо формируете новые коммиты (и, следовательно, новую историю). Вы должны выбрать один из этих вариантов, который затем диктует, что делать.   -  person torek    schedule 13.11.2017


Ответы (1)


Это сохранит историю (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')"
person ephemient    schedule 13.11.2017