Задача: смержить две ветки большого проекта, которые были выделены из транка уже давно (различий много). Одна ветка хранится в SVN, другая — в VSS. Не спрашивайте, почему так получилось, изменить это невозможно.
Проблема: существующие инструменты для слияния файлов (WinMerge, TortoiseMerge, Araxis) сравнивают файлы построчно, что не очень удобно в случае больших файлов и больших изменений. Даже если просто банально переставить два метода местами (особенно если они перегруженые), эти проги выдадут достаточно много различий.
Вопросы:
1) может быть, у кого-нибудь есть know-how по поводу слияния больших проектов?
2) слышал ли кто-нибудь про инструменты для merge со встроенным синтаксическим анализатором? Наличие анализатора позволило бы выделять отдельные блоги, сравнение которых действительно имеет смысл. Например, можно было бы сравнивать не файлы целиком, а только тела функций с одинаковыми сигнатурами или объявления одноимённых переменных.
3) пробовал ли кто нибудь организовывать merge разных репозиториев посредством миграции этих репозиториев в ветки одного репозитория git (или hg), а потом сливать код средствами этих dcvs? По идее, dcvs должны сильно облегчать дело слияния, потому что для них это — повседневная операция.
Здравствуйте, windj007, Вы писали:
W>Задача: смержить две ветки большого проекта, которые были выделены из транка уже давно (различий много). Одна ветка хранится в SVN, другая — в VSS. Не спрашивайте, почему так получилось, изменить это невозможно.
Попробуй для начала взять общего предка обеих версий (сам знаешь, в которой из систем он хранится), и сделать 3-хсторонний мёрдж (3-way merge). Например в Araxis Merge идли другом туле, который это умеет.
Думаю, это должно упростить задачу и убрать немало неоднозначностей.
Здравствуйте, windj007, Вы писали:
W>Однако задача ещё не решена, поэтому тема не закрыта
К слову, ты в пунтке 3 сам ответил на свой вопрос — слей всё на ветки в git (не забываем сначала слить туда общего предка), а потом сделать их слияние. Тот же гит по слухам весьма крут по части трекания перемещений функций между файлами, не говоря уже про "внутри файлов" (там вообще понятие файл во внутренней структуре репо — отсутствует).
Из svn в гит экспортнуть можно. Насчет VSS — не уверен, но из него тебе нужна будет только одна версия (ну или две, если там общий предок), так что нужные версии можно тупо выгрузить руками и залить в гит.
Ну а после этой операции думай, как дальше с этим жить. Остаться в гите или коммитить результит слияния обратно в SVN (надеюсь, в VSS тебя ничто не тянет?).