Как изменить историю репозитория git, чтобы показать, что содержимое было импортировано из другого репозитория? - PullRequest
3 голосов
/ 20 октября 2010

У меня есть два проекта, A и B. Они были плохо разделены, потому что A должен был выполнить одну часть до B, а другую - после B. Поэтому я решил объединить их. Содержимое B было скопировано в рабочий каталог A, зафиксировано, и работа оттуда продолжалась.

Конечно, история B не была сохранена в копировальной пасте. Я хочу исправить это, пока оно не было забыто, а потом кого-то кусает.

Как я могу изменить историю репозитория A, чтобы показать импорт из репозитория B?

Я думаю, что мне нужно ввести новый корневой узел, скопировать материал B в этот корень, а затем заменить коммит «добавить новые файлы» на «объединить корень B в A». Я понятия не имею, как это сделать.

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Вы должны сначала выполнить слияние поддерева с коммитом перед копированием-вставкой, а затем перебазировать следующие коммиты в результат слияния.Убедитесь, что вы помните переключатель --preserve-merges для rebase, иначе два дерева будут чередоваться вместо слияния.

Команды:

'(First, write down the ids of the current head and the commit before the copy paste)'
'(Second, do this on a copy of the repository in case you make a mistake)'

#Set the head to the commit before the copy paste (and checkout that commit)
git reset idOfCommitBeforeCopyPaste --hard

#Merge-in the master branch from the other repository, using magic
git remote add -f otherName other/repository/path
git merge -s ours --no-commit otherName/master
git read-tree --prefix=otherName/ -u otherName/master
git commit -m "Subtree merge from other"

'(Now you many want to move some files and do a commit)'
'(Write down the id of the current head, which is the result of the merge)'

#Apply all following commits to become equivalent to the up-to-date commit, and checkout
git reset headIdFromBeforeWeStarted --hard
git rebase mergeCommitId --preserve-merges

'(You may have conflicts; resolve them in the normal way then rebase --continue)'
'(To verify you did not change the present, compare the resulting working directory)'
2 голосов
/ 20 октября 2010

Звучит так, как будто вы хотите сделать объединение поддеревьев .

...