Что я делаю не так с слиянием SVN?

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

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

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

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

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

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

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

4 ответа

Эта проблема иногда возникает, когда в прошлом выполнялось частичное слияние от магистрали к ветке. Частичное слияние - это когда вы выполняете слияние со всем деревом, но фиксируете только его часть. Это даст вам файлы в вашем дереве, которые имеют данные 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 на всем дереве, но я не пробовал, и вы должны быть абсолютно уверены, что нет никаких реальных слияний, которые должны исходить из ствола)

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

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

  1. Скопировать ствол в новую ветку (branches/foo2).
  2. Слить изменения из старой ветки (слить branches/foo в branches/foo2).
  3. Удалить старую ветку (удалить branches/foo).

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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

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

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

Другие вопросы по тегам