Subversion Merge: Как я могу полностью интегрировать "окончательную" ветвь?

Мы экспериментировали с новой методикой управления ветвями выпуска.

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

Мы периодически сливали исправления ошибок из соединительной линии в ветвь выпуска (еженедельно).

Теперь, когда мы готовы к другой версии, мы хотели бы объединить ветвь релиза в багажник. К сожалению, это приводит ко многим конфликтам ( > 50). Сначала я был удивлен, но теперь я понимаю, что Subversion не может легко исправить изменения в ветке с тем, что существует в туловище.

Есть ли способ сказать Subversion использовать все версии файлов в ветке при интеграции обратно в багажник? Мы знаем, что версии ветвей файлов являются "правильными".

В качестве альтернативы мы могли бы теоретически отказаться от магистрали и просто отработать ветку (ветки) - ветвление от ветки для релизов.

Мы используем TortoiseSVN и Subclipse.

Ответы

Ответ 1

Из вывода svn help merge:

- принять ARG

указать автоматическое разрешение конфликтов ( "отложить", "базу", "минный конфликт", "их конфликт", "заминировать", 'theirs-full', 'edit', 'launch')

Чтобы принять изменение ветки при слиянии с соединительной линии, вам понадобится опция "--accept theirs-full".

Я не думаю, что TortoiseSVN 1.6.2 имеет эквивалентный вариант в графическом интерфейсе. Вы можете интерактивно разрешать конфликты, выбирая "use repository", поскольку каждый конфликт встречается во время слияния.

Ответ 2

Я считаю, что то, что вы делали, копируя исправления ошибок из туловища в вашу ветвь релиза, иногда называют rebasing. Все средства переустановки в этом случае - это то, что вы берете ветвь, которая обычно основывается на том, что, скажем, ревизия r49 соединительной линии, и смените изменения с say r50-r57 туловища в ветку, чтобы послесловие теперь можно рассматривать эту ветвь как основанную на пересмотре r57 туловища вместо ревизии r49.

На практике проблема заключается в том, что при слиянии диапазона ревизий с туловищем или любой другой базой в одну из ветвей это не reset базовая ревизия, в которой эта ветвь была создана, но вместо этого выходит из нормального mergeinfo как единственный способ узнать, что было объединено. Чтобы иметь возможность реинтегрировать изменения из ветки обратно в базу (например, тубу), без непреднамеренного воспроизведения объединенных изменений базы, скажем, из r50-r57 в моем предыдущем примере было бы объединение изменений от ветки к основанию вишней выбор конкретных изменений таким образом, чтобы любые изменения, вызванные перезагрузкой (слияние с базой на ветку), не включались.

К сожалению, помимо разработчиков Subversion разработчики могли бы реализовать способ автоматизации этого, чтобы только ревизии, которые не содержат свойство mergeinfo, которое описывает слияние, которое содержит только изменения между исходной версией базы и целевой ревизией базы (обычно HEAD). Это становится более сложным в том, что слияния часто включают в себя ручные изменения, которые совершаются вместе с фиксацией слияния на ветке, которая будет потеряна, а также происхождение любого данного объекта нужно будет отследить до общего предка, чтобы это работало правильно на staircased. Кроме того, функция, которая позволит заменить ветку новой копией базы или туловища со всеми предыдущими фиксациями, повторно примененными в виде серии отдельных коммитов, также сделает это возможным и, тем не менее, неудобным, будет вести себя как настоящая перебаза.

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

Обновление:. Согласно документации Subversion, при использовании параметра - reintegrate, который должен быть Subversion способный правильно реинтегрировать работу, выполненную в ветки, таким образом, чтобы учесть любые возможные обновления, которые могли быть сделаны для внесения изменений в базу. Конечно, это технически немного отличается от перезагрузки, но я думаю, что он достаточно похож на использование, что его можно назвать перезагрузкой. Главный вопрос заключается в том, работает ли опция -reintegrate, когда изменения из базы были объединены в туловище в вишневом стиле, вместо того, чтобы слить все из BASE + NEXT в HEAD.

Обновление: Похоже, что поддержка вишни должна поддерживаться, а также при использовании опции svn merge --reintegrate для Subversion 1.5 и выше. Следуя этим инструкциям, вы должны будете реинтегрироваться, не вызывая непреднамеренных конфликтов из-за повторного введения изменений в изменениях перестановки.

Для получения дополнительной информации прочитайте книгу Subversion в разделе Сохранение синхронизации в ветке.

Ответ 3

Может быть, я что-то пропустил, но, похоже, самым простым вариантом было бы удалить соединительную линию и заново создать ее, разветвясь из новой ветки релиза.

Ответ 4

В теории вы могли бы "слить два разных дерева" с головы туловища на голову ветки. Это должно избегать любых нечетных конфликтов из-за реинтеграции.