Подтвердить что ты не робот

Что я делаю неправильно с слиянием SVN?

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

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

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

  • Создать ветку
  • Разработка в филиале
  • Время от времени Объединить диапазон исправлений от соединительной линии к ветке
  • Когда ветка стабильна, Восстановите ветвь от ветки к магистрали
  • Удалить ветку

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

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

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

4b9b3361

Ответ 1

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

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

Вы можете:

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

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

    или

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

Ответ 2

Bunny hopping может быть решением.

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

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

Ответ 3

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

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

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

EDIT:

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

полная версия для mergeinfo здесь.

Ответ 4

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

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

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

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