@desperand

Как совместить два совершенно разных git репозитория с 90% общей базы, что бы приватный форк легко обновлять коммитами из основного репозитория?

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

Имеется следующее:
а.) ORIGINAL_GITHUB_REPO - репозиторий продукта с 14000 коммитами, который развивается до сих пор. Из этого ORIGINAL_GITHUB_REPO мне необходимо обновить мой MY_GIT_REPO. Но о нем ниже, сейчас поймете.
б.) SVN_FORK_REPO - это SVN репозиторий созданный в 2013 году одним человеком, который продавал расширенную версию ORIGINAL_GITHUB_REPO (т.е. на кодобазе этой, добавил туда своих изменений и фич).
в.) Этим SVN_FORK_REPO и пользовались, для него же создали GIT репозиторий, потому что удобнее было с GIT работать, а не с SVN, и назовем его MY_GIT_REPO.

Получилось что-то следующее:
MY_GIT_REPO/master -> SVN Repository from SVN_FORK_REPO - хранится как бранч который при появлении обновлений я обновляю (svn update), а после перехожу на бранч ниже и мержу изменения, и немного корректирую проблемы. И данная смеха пользовалась годами, пока разраб SVN_FORK_REPO не свалил, и не кинул всех.
MY_GIT_REPO/development -> уже тут я делаю все свои изменения, по мее появления обновлений (пачка коммитов слитых разработчиком из ORIGINAL_GITHUB_REPO в единый коммит для поддержания продукта в актуальном состоянии, раз в месяц он так обновлял свой продукт. Т.е. он брал как-то мержил изменения у себя на своей стороне, проверял что все компилится и скидывал уже пачку коммитов с ORIGINAL_GITHUB_REPO в свой SVN репозиторий, откуда уже мы брали изменения с помощью SVN update в мастер ветке (да да, вы правильно поняли, при инициализации .svn была не тронута, и она хранится и полностью рабочая в master бранче). Вот и получается что сейчас в этом SVN репозитории r164, которая соотвествует r13664 но уже в гите.

Все было бы хорошо, да ничего, пока в один прекрасный момент разработчик SVN_FORK_REPO не свалил, и не прекратились обновления его SVN репозитория с изменениями из ORIGINAL_GITHUB_REPO. Прошло около 6 месяцев, и нужно обновлять продукт из ORIGINAL_GITHUB_REPO. Вот тут я уже и прихудел, и не знаю как быть.

Как делал я:
1. Брал MY_GIT_REPO бранч и смотрел приблизительную дату последних изменений с SVN_FORK_REPO, потом искал коммиты которые соотвествуют изменениям уже в ORIGINAL_GITHUB_REPO ну и заходил на гитхаб коммит, дописывал .diff в конце, получал патчик, и применял его для своего кода, при появлении конфликтов решал их руками. Но это было до тех пор, пока разница была не очень большой (отставание от HEAD не было больше 10-20 коммитов). Сейчас же отставание около 300 коммитов, и нужно их как-то эти коммиты в ORIGINAL_GITHUB_REPO перенести в MY_GIT_REPO, и я не знаю как.

Собственно вопрос:
Если имеется MY_GIT_REPO, у которого 90% кода совпадает 1 в 1 с ORIGINAL_GITHUB_REPO, но при этом эти два репозитория не знают вообще ничего друг о друге, и проект приватный (MY_GIT_REPO) который нельзя запостить в паблик. То каким образом быть? Как забрать недостающие 300+ коммитов с ORIGINAL_GITHUB_REPO и применить их в MY_GIT_REPO? Как лучше организовать такую работу?

Важное замечание. Речь идет о проекте с 500+к строк кода, изменений кастомных на 30-40к строк кода, а остальные 450к идентичны. Взять и сравнивнить два репозитория с помощью araxis или других утилит я могу а потом взять чистый репозиторий с ORIGINAL_GITHUB_REPO и в отдельном бранче накатить все кастомные изменения разом, но это очень и очень долго, и остановиться разработка основного продукта.

Как быть? Как немного автоматизировать получение патчей и применение их при том, что два репозитория имеют 90% схожий код, и я просто устал ручками добавлять по одному коммиту выдирая из ORIGINAL_GITHUB_REPO и добавляя в блокнотике для MY_GIT_REPO.

При git format patch и git am -3 возникают различные ошибки типа: нет в индексе, либо еще что-то. Но это нормально, ведь бранчи не знают друг друга вообще.
  • Вопрос задан
  • 427 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы