Слияние Subversion: Как мне Чисто Реинтегрировать 'Определенную' Ветвь? - PullRequest
13 голосов
/ 12 мая 2009

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

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

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

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

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

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

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

Ответы [ 4 ]

11 голосов
/ 12 мая 2009

С выхода svn help merge:

- принять ARG

указать действие автоматического разрешения конфликта («отложить», «база», «мой конфликт», «их конфликт», «мой полный», «их полный», «редактировать», «запускать»)

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

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

6 голосов
/ 09 февраля 2011

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

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

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

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

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

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

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

0 голосов
/ 12 мая 2009

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

0 голосов
/ 12 мая 2009

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

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