Subversion филиал реинтеграции

Когда ветвь реинтегрируется в ствол, эта ветвь фактически мертва?

Можете ли вы внести изменения в ветку после реинтеграции и объединить их позже в ствол?

10 ответов

Решение

Вы можете сделать это технически, ваша ветвь не мертва и не отключена, но после реинтеграции не рекомендуется сливаться из ветки в ствол.

Вы можете найти полное обсуждение причины этого здесь: Subversion merge reintegrate

В основном, это говорит о том, что можно снова объединить ваши изменения в ствол, но поскольку реинтеграция вынуждает вас сливаться из ствола в ветвь до операции реинтеграции, вы столкнетесь с Reflective/Cyclic Merge, что очень проблематично в Subversion 1.5.,
Согласно статье, рекомендуется сразу же после реинтеграции удалить реинтегрированную ветку и вместо нее создать новую с тем же (или другим) именем.

Это известное поведение Subversion, которое будет рассмотрено в будущей версии (вероятно, в 1.6)


На самом деле, вам нужно сделать --record-only объединить из ствола в вашу ветку ревизии, которая была создана --reintegrate совершить:

$ cd trunk
$ svn merge --reintegrate ^my-branch 
$ svn commit

Committed revision 555. 
# This revision is ^^^^ important

И теперь вы записываете это

$ cd my-branch
$ svn merge --record-only -c 555 ^trunk 
$ svn commit

Вы счастливы сохранить ветку сейчас

Больше информации в Главе 4. Ветвление и Слияние, Расширенное Слияние.

После того, как вы реинтегрируете из ветви в ствол, вы должны сделать одну из двух вещей:

  • Удалить свою ветку. Это самый простой способ, но он усложняет просмотр истории отрасли.

  • Скажите вашей ветке не объединять реинтеграционный коммит. Если вы реинтегрируетесь в транк и фиксируете его как ревизию X, вы можете запустить эту команду в своей ветке: svn merge --record-only -c X url-to-trunk, Однако вам не следует делать это, если вы внесли какие-либо изменения как часть фиксации, кроме самого слияния. Любые другие изменения никогда не вернутся в вашу ветку.

Несколько советов по объединению изменений, если кто-то вносит изменения в ветку несколько раз (до 1.5): Помните, в какой ревизии вы произвели слияние! Либо записывайте номера ревизий куда- либо, либо (что проще) сделайте тег. (Конечно, вы можете узнать это позже, но это PITA.)

Пример:

У вас есть макет хранилища, как это:

/your_project
  /trunk
  /branches
  /tags

Допустим, это веб-приложение, и вы запланировали сделать релиз. Вы должны создать тег и из этой (или из ствола) ветку, в которой вы исправляете ошибки:

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0

Делая это таким образом, вы можете интегрировать новые функции в ствол. Все исправления будут происходить только внутри ветви исправлений, и перед каждым выпуском вы делаете тег текущей версии (теперь из ветви исправлений).

Давайте предположим, что вы исправили много ошибок и выпустили их на рабочий сервер, и вам нужна одна из этих функций в текущем транке:

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2

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

svn merge http://rep/your_project/tag/1.0.0 http://rep/your_project/tag/1.0.2 .

Это то, что вы должны помнить. Вы уже объединили изменения между 1.0.0 и 1.0.2 в стволе. Давайте предположим, что в текущем выпуске есть больше изменений:

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2
    /1.0.3
    /1.0.4

Теперь вы готовы выпустить новую версию из транка, но последние изменения ваших исправлений все еще отсутствуют:

svn merge http://rep/your_project/tag/1.0.2 http://rep/your_project/tag/1.0.4 .

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

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
    /1.1.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2
    /1.0.3
    /1.0.4
    /1.1.0

Как все уже говорили здесь: ветвь не мертва, и фиксации в ветке могут продолжаться просто отлично.

Иногда, хотя вы хотите убить ветку после слияния. Единственное надежное решение - удалить ветку. Недостатком является то, что тогда будет сложнее снова найти ветку, если вы захотите взглянуть на нее, скажем, по историческим причинам. Таким образом, многие люди оставляют "важные" ветви валяться и соглашаться не менять их. Хотелось бы, чтобы был способ пометить ветку как мертвую / только для чтения, таким образом гарантируя, что никто не сможет выполнить ее до дальнейшего уведомления.

Нет, ветвь еще жива, но в этот момент она точно такая же, как ствол. Если вы продолжаете разработку в ветке, вы можете позже снова объединиться со стволом.

Прежде всего, вам следует обновить клиент и сервер Subversion, если вы все еще используете Subversion 1.7 или более раннюю версию. Нет причин использовать очень старые выпуски Subversion. По состоянию на 2016 год текущей версией является Subversion 1.9. SVN 1.8 также поддерживается и до сих пор получает исправления ошибок.

Проблема, о которой вы спрашиваете, была решена в Subversion 1.8. Начиная с SVN 1.8, --reintegrate опция устарела. Реинтеграция слияний теперь выполняется автоматически. См. Запись о выпуске Subversion 1.8, связанную с улучшением.

Читать SVNBook 1.8 | Реинтеграция филиала:

Если вы решите не удалять свою ветвь после ее реинтеграции в ствол, вы можете продолжить выполнять объединение синхронизации из ствола, а затем снова реинтегрировать ветку. Если вы сделаете это, только изменения, сделанные в вашей ветке после первой реинтеграции, будут объединены в ствол.

...

Только Subversion 1.8 поддерживает повторное использование функциональной ветви. Более ранние версии требуют особой обработки, прежде чем ветвь функции может быть реинтегрирована более одного раза. См. Более раннюю версию этой главы для получения дополнительной информации: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html

Вы можете объединяться из ветви в магистраль или из магистрали в ветку столько раз, сколько хотите.

Когда вы делаете слияние, вы указываете цель. Вы можете объединить различия TreeA и TreeB с TreeC, если хотите. Как предполагает Крис, ваш вопрос не имеет особого смысла. Если вы сливаете свою ветку в ствол, ветка остается нетронутой. Если ветвь больше не нужна, вы можете удалить ее.

Вы можете продолжить разработку в ветке, вам понадобится функция отслеживания слияний, которая есть в Subversion 1.5, это означает, что дополнительные слияния из ветви включают только новые изменения.

Другие вопросы по тегам