Слияние двух репозиториев GitHub без потери истории коммитов

Копирование файлов переносит содержимое, но не делает коммиты исходного проекта предками новой ветки. Для сохранения истории нужен merge двух графов.

Подготовка и слияние

Работайте в отдельных резервных клонах с чистым рабочим деревом. В исходном клоне создайте ветку и перенесите нужные отслеживаемые файлы в отдельный подкаталог через git mv. Перечень заранее проверьте командой git ls-files, включая скрытые файлы. Каталог .git переносить нельзя. Пути ниже — заполняемые примеры, а не готовая команда для вашего проекта.

git switch -c prepare-import
mkdir -p imports/source
git mv path/to/tracked-file imports/source/
git commit -m "Prepare source paths"

# В рабочей копии целевого репозитория:
git switch -c import-source
git remote add import-src /ABS/PATH/TO/PREPARED-CLONE
git fetch import-src
git merge --no-ff --allow-unrelated-histories import-src/prepare-import

При конфликтах слияние останавливается: проверьте git status, вручную согласуйте содержимое, добавьте разрешённые файлы и завершите merge-коммит. Проверка ниже должна завершиться с кодом 0; граф истории и файлы дополнительно просмотрите самостоятельно.

git merge-base --is-ancestor import-src/prepare-import HEAD
git log --all --graph --oneline

При последующем слиянии PR сохраняйте merge-историю; squash превращает пачку изменений в один коммит. Удалять исходный репозиторий до проверки результата не нужно. Метод основан на разборе Mozilla от 29 августа 2022 года; примеры здесь упрощены и переписаны.