Рефакторинг разветвленного кода SVN

Проект, над которым я работаю, отчаянно нуждается в рефакторинге. Проблема в том, что обычно существует несколько веток (обслуживание, новые функции и т. Д.), И я не уверен, что мы можем легко перемещать, переименовывать и удалять файлы и каталоги и объединять изменения. Я опасаюсь, что переместил бы файл в ветку рефакторинга, пока кто-то другой обновляет файл в другой ветке. Я надеялся на небольшое окно, в котором в основной ветке есть все и никаких ветвей не требуется, но бизнес всегда нуждается в изменениях (немедленно или как часть незначительного выпуска).

Управление исходным кодом осуществляется с помощью Subversion. Легко / возможно ли радикально изменить проект в одной ветке, сохранив синхронизацию изменений с другими? Я неплохо умею объединять изменения, чтобы поддерживать ветки в актуальном состоянии, и, возможно, просто вносить небольшие изменения рефакторинга за раз. В противном случае, действительно ли это можно сделать, только выделив некоторое время, когда мы будем работать только над рефакторингом (т.е. без других веток)? Я пытался убедить владельцев бизнеса, что нам нужно время для рефакторинга, и, хотя они согласны с этим, сейчас это просто невозможно.

Одна из важных вещей, связанных с рефакторингом, заключается в том, что он должен выполняться всегда (а не раз в разы). Это кажется выполнимым с реальным кодом (разделение функций, удаление повторяющегося кода и т. Д.), Но я не так уверен в правильном переименовании и группировке файлов.


person ravun    schedule 25.07.2012    source источник


Ответы (3)


Это возможно в SVN, но я могу сказать вам, что вы столкнетесь с множеством других проблем. Подумайте дважды, действительно ли вы хотите, чтобы рефакторинг коснулся всех веток? Кажется нецелесообразным объединять отредактированный код для выпуска ветвей (которые являются ветвями обслуживания для выпуска мелких исправлений для производственных версий).

Хотя SVN может позволить вам слияние из любой ветки с любой веткой, всегда разумнее слияние ветки и исходной ветки. Поэтому, если у вас есть что-то вроде этого:

Rel-1.0          /---------------->
Rel-1.1         /   /------------------->
Trunk      --------------------------------*------>
FeatureA         \-------->  \       \     ^ (rev. X)
FeatureB                      \-->    \    |
Refactor                               \--->

Вместо того, чтобы выполнять рефакторинг в Refactor и объединять его со всеми остальными ветвями, более разумно повторно интегрировать изменение в Refactor ветке в Trunk (предположим, в ревизии X), а затем объединить ревизию X из Trunk с другими ветвями, которые нуждаются в этом изменении. . Для веток выпуска (Rel-1.0, Rel-1.1) это, скорее всего, будет изюминкой. Для функциональных веток A / B он будет догонять Trunk (путем объединения всех вещей в Trunk).

Обратите внимание, что слияние становится сложнее, если ваша ветка больше отклоняется от ствола. Поэтому подумайте дважды, если вам действительно нужно объединить отредактированный код для выпуска веток (который, скорее всего, сильно отличается от основной ветви).

Также обратите внимание, что отслеживание переименования в SVN реализовано не так хорошо. Например, вы переименовали файл F в магистрали в FNew, SVN обрабатывает добавление FNew путем копирования из F и удаление F. Если вы объедините его с ветвью, ага, SVN добавит ветку / FNew путем копирования из магистрали /. F и удалите ветку / F. Поэтому, если вы когда-либо изменяли ветку / F, для более новой версии SVN (вероятно,> = 1.5) это вызовет конфликт дерева, а в более старой версии SVN вы даже потеряете модификацию. Хотя более новая версия обрабатывается немного лучше, ни одна из них не обрабатывает слияние для «правильного» переименования (которое перемещает ветку / F в ветку / FNew). Это потребует дополнительных усилий при слиянии и сделает слияние еще более трудным в случае, если две ветви сильно расходятся.

person Adrian Shum    schedule 25.07.2012

Если вы резко измените ветку, у вас обязательно возникнут проблемы с повторным слиянием кода, особенно когда другие вносят изменения в одни и те же файлы.

Я бы порекомендовал здесь разумное планирование. Вам придется работать с частями кода, над которыми в настоящее время не работают. Или сделайте рефакторинг частью обычных бизнес-операций.

person Chris Henry    schedule 25.07.2012

Я думаю, вы можете просто изменить одну ветку, создать файл патча и использовать тот же файл патча для обновления всех других веток?

person Bruce_Van    schedule 25.07.2012
comment
Это хорошая идея. Я никогда не использовал файлы патчей, кроме тех, которые я скачал для исправления чужого кода. - person ravun; 25.07.2012
comment
использование патча не поможет, и вы также потеряли отслеживание слияния SVN. Просто использовать слияние - это нормально - person Adrian Shum; 25.07.2012