Что я делаю не так с слиянием SVN? - PullRequest
16 голосов
/ 12 мая 2010

Когда работает SVN с отслеживанием слияний, это действительно приятно, мне это нравится. Но это продолжает запутываться. Мы используем TortoiseSVN. Мы постоянно получаем следующее сообщение:

Ошибка: Реинтеграция может использоваться только в том случае, если ревизии с 1234 по 2345 были ранее объединены из / Trunk с источником реинтеграции, но это не так

Для справки, мы используем этот метод:

  1. Создать ветку
  2. Разработка в ветке
  3. Изредка Объединение диапазона ревизий от Ствола до Ветви
  4. Когда ветвь стабильна, Реинтегрировать ветку из ветки в ствол
  5. Удалить ветку

I Слияние диапазона ревизий от магистрали до ветви (оставляя диапазон пустым, поэтому все ревизии должны быть) непосредственно перед операцией реинтеграции, поэтому ветвь должна быть правильно синхронизирована с ствол.

В данный момент Trunk имеет несколько связанных свойств отслеживания слияний SVN. Должно ли это? Или Reintegrate не должен добавлять информацию об отслеживании слияний?

Что-то не так с нашим процессом? Это делает SVN непригодным для использования - 1 из 3 реинтеграций вынуждает меня погрузиться и взломать информацию об отслеживании слияний.

Ответы [ 4 ]

10 голосов
/ 22 сентября 2010

Эта проблема иногда возникает, когда в прошлом выполнялось частичное слияние от магистрали к ветке. Частичное слияние - это когда вы выполняете слияние со всем деревом, но фиксируете только его часть. Это даст вам файлы в вашем дереве, которые имеют данные mergeinfo, которые не синхронизированы с остальной частью дерева.

В приведенном выше сообщении об ошибке --reintegrate должны быть перечислены файлы, с которыми у svn возникла проблема (по крайней мере, в svn 1.6).

Вы можете либо:

  1. Слияние проблемных файлов вручную из магистрали в ветку, используя диапазон из сообщения об ошибке. Примечание: вы должны вычесть 1 из начала диапазона, поэтому команда, которую вы запустите, будет:

    cd <directory of problem file in branch working copy>
    svn merge -r1233:2345 <url of file in trunk>
    svn commit
    

    или

  2. Если вы уверены, что содержимое файлов в вашей ветке является правильным, и вы просто хотите пометить файлы как объединенные, вы можете использовать флаг --record-only для svn merge:

    cd <directory of problem file in branch working copy>
    svn merge --record-only -r1233:2345 <url of file in trunk>
    svn commit
    

(я думаю, вы можете использовать --record-only на всем дереве, но я не пробовал его, и вы должны быть абсолютно уверены, что нет никаких реальных слияний, которые должны исходить из ствола)

3 голосов
/ 01 июня 2010

Ваша проблема в том, что вы пытаетесь использовать слияние Reintegrate для ветви, которая была «повреждена» из-за того, что «половина слияния» уже сделана на ней. Мой совет - игнорировать реинтеграцию и придерживаться простого при слиянии ревизий, если это ваш рабочий процесс.

Однако основная причина, по которой вы получаете ошибки, заключается в том, что SVN выполняет некоторые проверки для вас. В этом случае, если в слиянии есть дополнительная информация о слиянии из отдельных файлов, тогда svn выдаст колебание и предотвратит слияние - в основном потому, что в этом случае могут возникать ошибки продукта, которые вы можете не заметить. Это называется объединение поддеревьев в терминологии svn reintegrate (см. Раздел «Реинтеграция в Rescue», в частности, спорную проверку реинтеграции в конце).

Вы можете прекратить запись информации о слиянии, когда выполняете промежуточные слияния, или просто оставить ветку в покое, пока она не будет готова - тогда слияние заберет изменения, внесенные в транк. Я думаю, что вы также можете обойти эту проверку, только когда объединяете весь ствол в ветвь, а не отдельные файлы, тем самым сохраняя безопасность mergeinfo для окончательной реинтеграции в конце.

EDIT:

@ randomusername : Я думаю (никогда не смотрел слишком внимательно) при перемещении это то, что оно попадает в ловушку «частичного слияния». Отличная особенность SVN заключается в том, что вы можете делать редкие проверки - получить только частичную копию дерева. Когда вы объединяете частичное дерево в, SVN не может сказать, что все это было объединено, как это, очевидно, не было, поэтому записывает mergeinfo немного по-другому. Это не помогает при реинтеграции, так как реинтеграция должна объединить все обратно в ствол, и теперь она обнаруживает, что некоторые биты были изменены без слияния, поэтому жалуется. Ход выглядит примерно так же - часть разветвленного дерева теперь выглядит в mergeinfo иначе, чем он ожидает. Я бы не стал заниматься реинтеграцией, а придерживался нормального слияния ревизионного диапазона. Это хорошая идея, но она пытается быть слишком многим для слишком большого количества пользователей в слишком многих различных обстоятельствах.

Полная версия для mergeinfo находится здесь.

3 голосов
/ 12 мая 2010

Кролик прыгает может быть решением.

По сути, вместо непрерывного объединения изменений транка в одну ветку (branches/foo, давайте назовем это), когда вы хотите извлечь эти изменения из транка:

  1. Копирование магистрали в новую ветвь (branches/foo2).
  2. Объединить изменения из старой ветки (объединить branches/foo в branches/foo2).
  3. Удалить старую ветку (удалить branches/foo).
0 голосов
/ 13 января 2014

Я подозреваю, что вы не правильно выполняете инструкции по слиянию:

"Теперь используйте svn merge с опцией --reintegrate, чтобы реплицировать изменения ветки обратно в ствол. Вам понадобится рабочая копия /trunk.. Вы можете получить ее, выполнив команду svn. извлечение, извлечение старой рабочей копии ствола из какого-либо места на вашем диске или использование переключателя svn (см. раздел «Обход ветвей»). Ваша рабочая копия ствола не может иметь локальных изменений или содержать смесь ревизий (см. раздел «Рабочие копии со смешанной ревизией».) Хотя в любом случае это, как правило, лучшие практики для слияния, они необходимы при использовании параметра --reintegrate.

Как только у вас будет чистая рабочая копия ствола , вы готовы объединить свою ветвь обратно в нее: "

У меня мало проблем со слиянием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...