Как правильно обновить филиал функции от Trunk?

StackOverflow https://stackoverflow.com/questions/2146426

  •  23-09-2019
  •  | 
  •  

Вопрос

SVN Book говорит:

...Another way of thinking about this pattern is that your weekly sync of trunk to branch is analogous to running svn update in a working copy, while the final merge step is analogous to running svn commit from a working copy

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

  1. Из SVN V1.5 слияние выполняется Rev-By-Rev. Вишня, поднимая районы, которые должны быть объединены, заставит нас разрешить дважды конфликты с туловищей (один при слиянии изменений в туловище в FB, и еще раз при слиянии).
  2. Размер репозитория: изменения ствола могут быть значимыми для большой кодовой базы, и копирование файлов различий (в отличие от копии SVN) из Trunk в других местах может быть значительным накладным расходом.

Вместо этого мы делаем то, что называем «повторным разветвлением». В этом случае, когда требуется значительная часть стволов туловища, из текущего туловища открывается новая филиала функций, а слияние всегда вниз (филиалы функций -> Trunk -> стабильные ветви). Это не идет по руководящим принципам книг SVN, и разработчики считают это дополнительной болью.

Как вы справляетесь с этой ситуацией?

Это было полезно?

Решение 2

После исследования:

После многих мозгового штурма в VisionMap обсуждения F2F, включая Artyom, открытие корпуса книги SVN и т. Д. - похоже, это невозможно сделать. Филиал функций совершенно не похож на рабочую копию. Единственный рабочий способ обновления - воссоздать новую филиал, как описано выше.

Другие советы

Из SVN V1.5 слияние выполняется Rev-By-Rev. Вишня, выбирая районы, которые будут объединены дважды (один при слиянии изменений в туловище в FB и еще раз при слиянии)

Тогда вы делаете что -то не так!

Посмотрим:

trunk    fb
 ---------\
 r1-10    |
 r11-20   |
 r20-30   |

Как правило, если вы хотите, чтобы изменения в 11-20, то лучшая практика-объединить 1-20 с FB и получить все там.

Затем, когда FB закончится, слияйте 20-30, а затем копия fb to thrunk (без слияния!).

Если вы решите объединить только R11: 20, OK, в конце вам нужно будет объединить R1: 10 и R20: 30, а затем копия FB TO TRUNK.

Вы никак не слияете меняются дважды!

Я предполагаю, что вы, вероятно, делаете следующее:

copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG

Вы не можете сделать это, потому что вы бы слияли 11:20 дважды. Вы всегда должны объединять код только в одном направлении.

Правильный путь:

copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk

Редактировать

Итак, правильные шаги:

  1. Создать филиал функций (FB) от Trunk (копия Trunk to Feature с SVN-Copy)

    FB_0=trunk_0
    
  2. Работа над фб.

    FB_1=FB_0 + change_a
    
  3. Объедините все предстоящие изменения от багажника до FB.

    trunk_1=trunk_0 + tr_change_a;
    FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
    
  4. Работа над фб

    FB_3 = FB_2 + change_b
    
  5. Объединить все в будущем Нессердечные изменения от туловища до FB.

    trunk_2=trunk_1 + tr_change_n;
    FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    
  6. На этом этапе у нас есть филиал, который состоит из все Новые функции ивсе Изменения в стволе. Поэтому мы просто копируем разницу между двумя ветвями.

    trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    

    Теперь FB удаляется, поскольку у багажника есть все изменения, которые нам нужны.

    Последний шаг выполняется:

    svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev .
    svn ci
    

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

Этот шаблон описан в http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature

Теперь, если это не работает для вас, я не понимаю вопроса.

Edit2: Для SVN-1.5

При работе с SVN-1.5 вы можете объединить намного проще:

Когда вы работаете над филиалом функции, вы просто сливаете, меня время от времени меняется:

$ svn merge /path/to/trunk
Solve conflicts
$ svn ci

Это выстроит ваш FB со всеми изменениями в туловище. В конце FB вы запускаете эту процедуру еще раз, чтобы убедиться, что все будет на свидание. Вы идете в сундук и бегите

$ svn merge --reintegrate /path/to/fb
$ svn ci

В последнем не должно быть никаких конфликтов, если вы работаете, как показано.

Мы небольшая компания, поэтому я не знаю, будет ли наше решение применяться к вашей ситуации. То, что мы делаем,-это рев, слияние от туловища к стабильной ветви. Мы можем сделать это двумя разными способами: - действительно необходимо исправить, мы объединяемся сразу после того, как посвящены туловище - опасное исправление/изменение. Мы ждем несколько дней, пока изменение не будет проверено в багажнике, а затем мы объединяемся

С этим непрерывным слиянием мы избегаем тонны конфликтов.

Мои 2 цента.

К сожалению, все упомянуто можно рассматривать как хаки. Обновление от туловища на ветке может привести к очень серьезным проблемам при возвращении его обратно в туловище и открывает возможность для худшего из всех конфликтов, конфликтов деревьев. Это потому, что каталоги не рассматриваются как граждане первого класса. Лучший подход - использовать Mercurial с расширением SVN в качестве стандартного клиента SVN. Это позволяет вам продолжать использовать SVN, получая силу обработки папок Mercurial.

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

Этот подход работает вокруг всех сторонних сторон SVN. Я переключился на этот подход из -за подобных обстоятельств. Даже если вы не используете этот подход сразу же, вы должны хотя бы попробовать как можно скорее.

Я думаю, что я должен взять здесь кубики для @Artyom. Я тоже думаю, что если тебе нужно

разрешить конфликты с туловищей дважды

что-то не так. И я думаю, что аргумент/решение @artyoms довольно солидно.

Я считаю, что одна из незначительных вещей @Artyom мог бы написать яснее, что в конце концов, где вы "копируете" fb к trunk Вы не используете svn copy но svn merge (или же svn merge --reintegrate) Это может быть причиной, по которой вы не найдете шаблон "Copy-Merge" в Общие закономерности ветвления.

Когда я борюсь с пониманием того, что вы делаете до сих пор, я не уверен, что еще сказать.

Вот что я слышу:

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

Теперь у вас есть новая филиал (давайте назовем это B2), которая эквивалентна туловище, верно? А также куда Нужна ли «значительная часть изменений туловища»? Я предполагаю в FB?

... и слияние всегда вниз (функции ветвей -> туловище -> стабильные ветви).

Но когда вы только что создали B2 из туловища, нечего слиться в туловище, не так ли? И вы также не объединяете изменения от B2 до FB (так как это будет то же самое, что слияние ствола с FB ...). Так как же «значительные куски изменений» попадают в FB? И как только они будут там, зачем вам слияние их обратно в туловище (так как это откуда, откуда они пришли)?

На самом деле следующие ссылки Раздел под названием «Отслеживание слияет вручную» и/или Раздел назывался «слияние целой ветви с другой» Предоставлено в документации SVN 1.4 (я знаю, вы не используете SVN 1.4, но я все равно применимо) под Общие закономерности ветвления может помочь прояснить некоторые вещи. Эти ссылки «отсутствуют» в документации 1.5 (вероятно, из -за нового --reintegrate вариант в merge).

Вы действительно, кажется, слияете одни и те же изменения дважды, и я действительно думаю, что вам не нужно (нужно) делать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top