Реинтеграция веток Subversion

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

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

Ответ 1

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

Вы можете найти полное обсуждение причины этого, здесь: Слияние конверсии Subversion

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

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


Ответ 2

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

$ 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. Ветвление и слияние, расширенное слияние.

Ответ 3

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

  • Удалить свой филиал. Это проще всего, но это затрудняет просмотр истории ветвей.

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

Ответ 4

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

Пример:

У вас есть расположение репозитория, как это:

/your_project
  /trunk
  /branches
  /tags

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

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

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

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

/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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Прежде всего, вы должны обновить клиент и сервер 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#svn.branchemerge.basicmerging.reintegrate

Ответ 9

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

Ответ 10

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