Git: объединение двух разрозненных независимых репо - PullRequest
3 голосов
/ 18 марта 2011

Хранилище A: перенесено в git из SVN проекта при ревизии r: клонировано все, включая всю историю SVN, теги и т. Д. Небольшое развитие после git.

Хранилище B:тот же проект, но независимо перенесенный из SVN на ревизии r+small_number.Только последний снимок был введен в Git.Впоследствии было много самостоятельной разработки.

Теперь я слил A в B. Идея состоит в том, что SVN будет отброшен, разработка будет продолжена в ветке develop репозитория проекта на GitHub.Я использовал простое слияние, чтобы сделать работу;К счастью, было очень мало реальных конфликтов .Развитие было в основном в разных областях, хотя после слияния было много очистки, не связанной с git.

Но: теперь, когда я делаю, например, git rebase -i HEAD~2 на объединенный результат , который, как я понимаю, должен позволить мне перебазировать последние два коммита, меня приветствует страница с более чем 300 коммитами - полная история проекта со времени ревизии 1 в SVN .Я прервал ребаз из-за страха еще больше испортить (очевидно, я новичок в Git).

Ожидается ли такой результат?Это желательно?Если нет, как это исправить?

Обратите внимание, что все модульные тесты и т. Д. Пройдены, сами файлы в порядке, только я не понимаю, что случилось с метаданными / историей git.

РЕДАКТИРОВАТЬ: это то, что я * думаю * хранилище выглядит сейчас:

          r         A
... o --- o --- ... o 
                     \ 
               B      \    
    o --- .... o ----  o --- ... o 
   r+small_number      C         HEAD

1 Ответ

8 голосов
/ 18 марта 2011

Полагаю, это происходит потому, что вы пытаетесь перебазировать коммит слияния.

Для следующего ответа я предполагаю, что ваша история выглядит следующим образом, то есть репозитории A и B полностью независимы:

          r         A
... o --- o --- ... o

o ... o
r'    B

Вы должны спросить себя, чего вы пытаетесь достичь?Итак, вы хотите иметь новую ветвь C, содержащую изменения A и B. Каковы приоритеты здесь?Вы хотите добиться правильной истории;исправить тот факт, что r' потерял свою историю SVN?Или важно сохранить неизменными историю Git A и B?

Мой ответ предполагает, что вы хотите достичь первого.Поскольку A и B происходят из очень похожих версий SVN-репозитория, было бы неплохо дать им общую базу git до слияния общей истории.Итак, в идеале перед слиянием вы должны иметь следующую ситуацию:

          r          A
... o --- o --- .... o
           \
            \
             o --- .... o
       r+small_number   B

В данный момент я не уверен, какой из способов лучше всего для этого, но вы можете попробовать выполнить git rebase -p --onto r --root B.

Тогда вы можете просто git merge A и B и получить историю

          r          A     C
... o --- o --- .... o --- o
           \              /
            \            /
             o --- .... o
       r+small_number   B

, где C содержит все ваши изменения.Я бы, вероятно, оставил это на этом;без дальнейшей перебазировки.

...