2016-06-24 3 views
1

Когда наш проект начался, мы не знакомы с git и в какой-то момент решили перезапустить репозиторий. Это означало, что мы импортировали весь файл в новый репозиторий, потеряв всю историю.Восстановление истории git из разделенных репозиториев

Сегодня я хотел бы знать, есть ли способ пересобрать эти 2 хранилища. В основном история файла в «старом-репо» должна быть добавлена ​​в историю этого файла в «new-repo».

У кого-нибудь есть идея, как начать с этого?

ответ

4

Вы можете сделать это довольно легко, извлекая коммиты из старого репозитория, а затем используя 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?.

+0

Эй, спасибо за отличный ответ! –