Объединить ветку в магистраль


125

Я столкнулся со специфической проблемой с SVN merge. Я хочу слить из ветки разработчика в транк. У нас есть несколько веток разработки, которые одновременно отсекают ствол.

Я объединяю одну из этих веток в магистраль с помощью этой команды:

svn merge trunk branch_1

Я вижу, что изменения, которые не являются частью этой ветки, объединяются в ствол. Что я делаю не так ?

Версия SVN:

Клиент командной строки Subversion, версия 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.


7
Я знаю, что это не ответ, но если у вас есть несколько активных веток одновременно, то, вероятно, вам лучше перейти на mercurial или git. Ps: Я не фанатик, работаю с svn ~ 7 лет ;-)
— zerkms

2
Какие преимущества это дает? Почему переход на git или mercurial - лучший выбор?
— Ванчинатан Чандрасекаран,

3
потому что git и mercurial намного лучше поддерживают ветки. Преимущества: вы не будете задавать такие вопросы и у вас будет меньше головной боли при создании и поддержке веток (в настоящее время я работаю в проекте с> 1000 веток, в svn было чертовски работать с ними)
— zerkms

Я рекомендую заглянуть в Svnmerge.py и просмотреть эту статью .
— chown

Ответы:


215

Ваш svn mergeсинтаксис неверен.

Вы хотите получить рабочую копию, trunkа затем использовать svn merge --reintegrateопцию:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

См. Главу книги SVN о слиянии для более подробной информации.


Обратите внимание, что в то время, когда это было написано, это был правильный ответ (и он был принят), но дела пошли дальше. См. Ответ topek и http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate


4
Параметр --reintegrate не является обязательным, ветвь (в 1.6) может быть объединена с любым местом назначения любое количество раз
— Lazy Badger

1
В самом деле? Без риска повторного объединения тех же наборов изменений? Не могли бы вы дать ссылку на подтверждающие доказательства этого?
— Neutrino

--reintegrateдействительно не является обязательным, но действительно рекомендуется в этом случае. Я попытался обойтись без него --reintegrateи закончил сотней конфликтов. С --reintegrate, никаких конфликтов и все было хорошо!
— tibo

17
--reintegrateВариант является простым и эффективным, но это не должно быть отмечено , что «После --reintegrateслияния осуществляются с ветки на ствол, ветви больше не может использоваться для дальнейшей работы. Это не в состоянии правильно усваивать новые изменения из ствола, и не может быть правильно реинтегрирован снова в багажник ". как объясняется в книге, которую вы связали.
— Пино

3
@daveL, для меня имеет смысл прямое слияние от ствола к ветке. Однако я обнаружил расширенную функцию, позволяющую «поддерживать работоспособность повторно интегрированной ветки» (см. Stackoverflow.com/a/10163059/685806 ), кроме того, она применяется автоматически более новыми версиями клиентов.
— Пино

78

Если ваш рабочий каталог указывает на магистраль, вы сможете объединить свою ветку с:

svn merge https://HOST/repository/branches/branch_1

обязательно выполните эту команду в корневом каталоге вашего ствола


7
Начиная с SVN 1.8. это правильный ответ. См. Subversion.apache.org/docs/release-notes/…
— GreenAsJade

@blahdiblah - фрагмент кода содержит много посторонней информации. Есть причина, по которой резюме исследований читают на порядки чаще, чем любую другую часть исследования. То же самое и с UX-тестированием, с минимизацией отказов и т. Д. Принцип один и тот же.
— ahnbizcad

с версией 1.7 вы можете выполнить слияние без опции --reintegrate и продолжить развитие в ветке, продолжая слияние. К сожалению, версия 1.8 заставит это быть реинтеграцией, и, похоже, нет способа предотвратить это. Это означает, что как только вы объединитесь, вы не сможете использовать ветку, не пройдя ужасный «танец сохранения жизни»
— Джон Литтл,

3
Не забудьте затем зафиксировать рабочую копию ствола обратно в репозиторий после слияния!
— Джон

16

Сделайте обновление svn в транке, обратите внимание на номер ревизии.

Из багажника:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

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

svn log --stop-on-copy

Поскольку существует несколько веток разработки, которые работают одновременно, это тоже не сработало для меня, эта команда также извлекала изменения из других веток. Может быть это проблема с SLik SVN клиентом?
— Vanchinathan Chandrasekaran

Хотя это и не является неточным, есть более простые способы слияния с более поздними версиями svn(например, с той, которую использует OP).
— blahdiblah 03

@VanchinathanChandrasekaran, в команде вы указываете имя ветки, так как оно svn://path/to/branch/branchNameдолжно извлекать только изменения из этой ветки, а не из других веток. Если так, то мы в опасности!
— Fredrick Gauss

1

Синтаксис неправильный, вместо этого он должен быть

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.