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

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

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


person Aaron Smith    schedule 19.09.2008    source источник
comment
Думаю, вам следует пересмотреть принятый ответ, потому что он больше не соответствует действительности. Проблема не существует в современных клиентах Subversion.   -  person bahrep    schedule 15.01.2016


Ответы (10)


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

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

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

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


person Pini Reznik    schedule 23.09.2008
comment
Кто-нибудь знает, была ли решена проблема реинтеграции в Subversion 1.6? - person Bradley Dwyer; 28.07.2009
comment
Я обратился к svn v1.6 в stackoverflow.com/questions/3309602. Краткая версия: да, вы можете реинтегрироваться несколько раз. :) - person Andres Jaan Tack; 23.07.2010
comment
Пини, ваша ссылка на повторную интеграцию слияния Subversion, похоже, не работает или, по крайней мере, требует некоторой аутентификации для совместной работы. Вы знаете, можно ли получить доступ к статье в другом месте без аутентификации? - person Kaitsu; 17.02.2011
comment
Думаю, это оригинальная статья: blogs.collab.net/subversion/2008 / 07 / subversion-merg, и это предыдущее обсуждение: svn.haxx.se/dev/archive-2007-11/0729.shtml - person Pini Reznik; 17.02.2011
comment
Голосование против, потому что ответ больше не актуален. - person bahrep; 15.01.2016

Фактически, вам нужно сделать --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. Ветвление и слияние, расширенное слияние.

person krico    schedule 26.05.2010
comment
Ответ устарел. - person bahrep; 15.01.2016

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

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

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

person JW.    schedule 24.02.2010

Несколько советов по обратному слиянию изменений, если кто-то вносит изменения в ветку несколько раз (до 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
person Mauli    schedule 22.09.2008

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

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

person Alexander    schedule 19.09.2008
comment
Свн МВ ^ / ветки / фу ^ / ветки / .dead / фу - person Jerome Baum; 04.10.2011

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

person Ben Hoffstein    schedule 19.09.2008
comment
Только логи разные. Журнал ветки будет более подробным, например, в нем будет указан истинный автор. - person Hugo; 27.10.2008
comment
См. Ответ Пини Резника и указанную в нем статью, по которой вы должны не продолжать использовать ветку (даже если это технически возможно). - person mhagger; 10.02.2010
comment
Серьезно, не делай этого. Это причинит вам мир боли. Удалите ветку, создайте заново. Я пришлю тебе запечатанную банку моих слез горя двухнедельной давности, если ты мне не веришь. - person detly; 31.05.2010

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

person Chris Marasti-Georg    schedule 19.09.2008

Прежде всего, вам следует обновить клиент и сервер 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

person bahrep    schedule 15.01.2016

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

person Jonah Braun    schedule 19.09.2008

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

person Douglas Leeder    schedule 19.09.2008