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

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

blahdiblah
источник
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

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

topek
источник
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)>
lwpro2
источник