«объединение» двух репозиториев git - PullRequest
0 голосов
/ 25 апреля 2018

У нас странная ситуация с нашим git-репозиторием. Намеченный рабочий процесс должен был создать наш собственный форк проекта с открытым исходным кодом с некоторыми нашими изменениями.

Репо изначально создавалось путем копирования файлов проекта с открытым исходным кодом без истории и «это работало». Когда мы захотели обновить базовый репозиторий с открытым исходным кодом, вместо слияния мы снова скопировали файлы и использовали инструмент diff для разрешения вручную. Это была и есть боль, которую мы действительно хотим закончить.

Мы хотим, наконец, погасить техническую задолженность и начать использовать git по назначению. Какими возможными способами мы можем это исправить, сохранив нашу историю и, наконец, имея основную историю открытого исходного кода. Обратите внимание, что наш проект используется как подмодуль, поэтому мы не можем создать новый репозиторий без серьезных последствий.

Это исправимо некоторыми секретными функциями git и большим количеством хитрости?

1 Ответ

0 голосов
/ 25 апреля 2018

Я бы поступил так.

  • Клонируйте репозиторий в исходном режиме как обычно, с историей и всем.
  • Создайте в нем ветку поверх главной ветви.
  • Для каждого отдельного коммита, который вы должны экспортировать (вероятно, только верхний коммит, если у вас нет полезной недавней истории):
    • Проверьте, что коммит в вашем репо;
    • Скопируйте его в дерево репозитория верхнего уровня, как файлы;
    • Просмотр изменений, отмена ненужных деталей;
    • Пройти тесты и т. Д .;
    • Передать изменения.

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

Теперь у вас есть ветвь сверху основного мастера, которая может быть предложена как запрос на извлечение. Гарантируется чистое слияние (потому что это поверх master, а не ветвления от предыдущего коммита), в нем есть ваши изменения, все тесты пройдены (включая тесты для ваших изменений).

Если вы хотите, чтобы ваша предыдущая история использовалась для справки, есть несколько вариантов.

Самое простое: сохранить его в своем текущем (не восходящем) репо. Это никуда не денется, но вы должны, например, Подберите ваши изменения в другом репо.

Легко, но немного глупо: создайте новую ветку в репозитории восходящего потока поверх первого коммита (см. эти инструкции ) и перенесите всю свою историю в эту ветку. Недостатком является то, что ваша история теперь вообще не связана с историей магистрали.

Более болезненный: определите точки, где вы коснулись вверх по течению, и объедините, если хотите.

  • Сделайте то же, что и выше, чтобы создать ветку с вашей историей в репозитории (baseless_branch).
  • Определите коммит, с которого вы начали разработку, и создайте новую ветку поверх него (based_branch).
  • Cherry-выбрать диапазон коммитов от baseless_branch до based_branch до того момента, когда вы снова скопировали файлы из master.
  • (Необязательно.) После достижения точки «скопированные файлы» объедините master с вашим based_branch с master в том месте, где вы скопировали файлы. Это должно слиться чисто, потому что государство то же самое. (У меня нет хорошей идеи, как определить эти коммиты в master.)
  • Продолжайте сбор вишни (и слияние), пока не достигнете вершины baseless_branch; теперь объединяйтесь с master, просматривайте и разрешайте конфликты, добавляйте необходимые изменения и т. д.

Теперь у вас есть собственная ветвь, которая растет с правильной точки истории, опционально с промежуточными точками слияния, где она соответствует основной истории. Эта ветвь также является хорошим пиар-материалом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...