Вы можете сделать это довольно легко, извлекая коммиты из старого репозитория, а затем используя git rebase
, чтобы воспроизвести историю нового репозитория поверх старого.
Сначала возьмите коммиты из старого хранилища.
git remote add old_repo <url-for-old-repo> # Add old repository as a remote
git fetch old_repo # Fetch commits from old repo
Далее найдите фиксацию в старом репозитории, которая соответствует корневой фиксации вашего нового репозитория. Вы можете найти git log
для этой цели. Вы можете проверить, соответствует ли содержимое коммитов, запустив git diff <commit in old repo> <commit in new repo>
и проверив, чтобы не было выхода из этой команды. Если есть выход из этой команды, либо продолжайте искать, пока не найдете фиксацию в старом репозитории, которая не производит этот вывод, или сделайте одно (проверив аналогичную фиксацию в старом репозитории, внеся необходимые изменения в рабочий каталог и фиксация).
После того как вы нашли это коммитирование, найдите дочерний элемент фиксации корневой фиксации в новом репозитории. Это должно быть первое коммит в новом репо, которое вводит новые изменения, которые не находятся в старом репозитории. Вы будете использовать эту фиксацию вместе с фиксацией, которую вы обнаружили в старом репозитории ранее, в следующей команде.
Пробег:
git checkout master
git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges
Это должно воспроизводить коммиты из нового хранилища на старый репозиторий. Предполагая, что вывод предыдущего git diff
был пустым, как я предположил, вы не должны сталкиваться с конфликтами слияния. Как только команда завершается, ветвь master
должна включать историю из старого репозитория.
Поскольку эта процедура связана с изменением истории репозитория, вам нужно будет использовать опцию --force
при следующем нажатии главной ветви в удаленный репозиторий.
Если у вас есть какие-либо другие отрасли, кроме мастера, вам нужно будет следовать аналогичной процедуре, как выше один, чтобы переместить их на новый репозиторий:
git checkout branchname
git rebase --onto <base on new master branch> <first commit in branch> --preserve-merges
Теги, вероятно, не должны быть перемещены, так как они должны быть неизменными. Если вы действительно хотите переместить тег в новую историю, см. How can I move a tag on a git branch to a different commit?.
Эй, спасибо за отличный ответ! –