Об’єднайте гілку в багажник


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 і переглянути цю статтю .
човен

Відповіді:


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
- опція реінтеграції не є обов'язковою, філія (в 1.6) може бути об'єднана з будь- яким пунктом призначення будь - яку кількість разів
Lazy Badger

1
Дійсно? Не ризикуючи перезапускати ті самі набори змін? Чи можете ви надати посилання на підтвердження підтвердження цього?
Нейтрино

--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(наприклад, однією з ОП).
blahdiblah

@VanchinathanChandrasekaran, в команді ви вказуєте ім'я гілки, як svn://path/to/branch/branchNameце повинно тягнути лише зміни з цієї гілки, а не з інших гілок. Якщо так, ми загрожуємо!
Фредрік Гаус

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.