2010-08-20 2 views
23

Как объединить ветку обратно в багажник в SVN со всей историей фиксации? Я знаю в Git, я могу использоватьКак объединить ветку обратно в магистраль в SVN со всей историей фиксации?

merge -squash 

Есть ли эквивалентная команда в SVN? Я использую SVN 1.6.

+4

Какая версия SVN работает на сервере? 1.5 и более поздние версии имеет огромное значение для вашего вопроса против 1.4 или более раннего. –

ответ

35

С Subversion 1.5 или более поздней версией слияние записывается на вашей локальной рабочей копии в свойстве svn: mergeinfo. Так что эта информация не потеряна.

Вы можете увидеть объединенные версии, если вы используете svn log -g вместо обычного svn log.

Нормальные слияния выполнены в виде

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

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

svn merge svn://server/trunk my_branch_wc 

(Это сливает все, что не уже слитую)

И после того, как вы фиксируете это изменение в отрасли вы можете использовать

svn merge --reintegrate svn://server/branch my_trunk_wc 

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

+0

_ "после этой операции вы должны удалить ветвь" _. Почему, не следует ли просто «удалять»? Мне нравится хранить всю историю до тех пор, пока она не вызывает никаких проблем. – Zitrax

+1

История все еще находится в старой ревизии, как вы можете видеть при запуске 'svn log -g'. Но вы больше не должны использовать ветку, так как ее невозможно объединить без дополнительной бухгалтерии. (Обратите внимание, что гораздо более новые версии Subversion (1,8+) снизили требование -reintegrate и даже могут снова использовать ветвь с правильным слиянием из магистрали) –

+0

@BertHuijben: Привет, сэр, не могли бы вы взглянуть на мой вопрос [здесь ] (http://stackoverflow.com/q/36157555/3287204)? Спасибо заранее ... :) –

1

Вы можете сохранить каждый набор изменений как diff, а затем зафиксировать каждый поверх сундука. Это обычно называют «пересадкой», и для этого используются различные инструменты.

+2

Любой пример этих инструментов? – turbanoff

5

Я немного ржавый с слиянием, но разве это не должно трюк?

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

См:

svn merge --help 
+1

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

+0

Я думаю, что вы правы ... Я сбивал с толку 'copy' который сохраняет историю. – DarkDust

+2

Разве это не значит 'svn: mergeinfo'? – detly

0

Это звучит, как вы хотите:

  1. Объединить с возможно несколько ветвей.
  2. Удостоверьтесь, что все слияния записаны как таковые.
  3. Зафиксируйте только одну новую редакцию.

Я думаю, что это поддерживается базовой SVN-архитектурой. Но я не знаю, есть ли какие-либо клиенты, которые его предоставляют (хотя svnmucc сделает это для нескольких команд cp, mv, rm). Если вы не хотите проводить больше исследований, чем у меня (что не займет много времени), или напишите свой собственный клиент, который может управлять библиотеками SVN для этого (что может быть сложно, но все же выполнимо); то я думаю, вам придется пожертвовать одним из 2. и 3. выше.

(Если вы жертвуете 3, вы можете сразу же сбросить хранилище и взломать файл дампа, чтобы использовать только одну ревизию, но я не думаю, что стоит риск получить просто более простую историю изменений ...)

1

Чтобы создать слияние филиала и создать одну фиксацию для каждой фиксации в отрасли, вы можете использовать скрипт, я использую следующее:

#/bin/bash 

BRANCH="http://your branch url" 

for i in {1127..1138} # list of revisions 
do 
    REV=$i 
    echo $REV $BRANCH 
    echo merged $REV from $BRANCH > tmps.commit 
    svn log -c $REV $BRANCH >> tmps.commit 
    svn up 
    svn merge -c $REV $BRANCH ./ 
    svn commit -F tmps.commit 
    rm tmps.commit 
done 

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

+0

Я просто использовал этот скрипт успешно, и он работает хорошо. Единственное соображение состоит в том, что, поскольку этот скрипт перебирает все номера версий от X до N, они не являются чисто последовательными числами, мы можем иметь версию 1131, за которой следует, например, версия 1135. В этом случае мы объединим чистую ревизию в новой ветке, создав коммит без изменений. Я могу изменить этот скрипт в следующий раз, чтобы проверить, является ли tmps.commit пустым, и если так «продолжить», чтобы избежать этих дополнительных изменений не происходит. Поскольку SVN не разрешает коммит без комментариев, это должно работать должным образом. – jcpennypincher

Смежные вопросы