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

Слияние между ветвями в Subversion не добавляет все новые файлы. Почему нет?

У меня есть дерево исходного кода в subversion с несколькими ветвями. Я только что закончил довольно интенсивный сеанс отладки в активной ветке, и теперь вам нужно объединить изменения в новую ветку. В последнее время новая ветка была снята с транка (которая представляет выпущенный код), после всего развития старой ветки (очевидно), но до того, как я совершил всю свою отладку. Однако попытка svn merge не объединяется во все файлы, которые были добавлены. Он добавляет некоторые, но не все.

Здесь строка времени:

  • Удалите соединительную линию для создания ветки dev1.
  • Код в dev1, изменение файлов и добавление файлов.
  • Удалите соединительную линию для создания ветки dev2.
  • Исправление ошибок в dev1, изменение файлов, но не добавление файлов.
  • Объединить все изменения в dev1 с dev2.

Как и ожидалось, есть много изменений, включая новые файлы, но не все из них. Это потому, что диапазон версий, из которых я объединяюсь, включает версию, которая сделала ветвь dev2? Или я должен сливаться с туловищем, а затем до dev2?

Изменить: Весь код полностью передается в Subversion. Но я думаю, что может произойти то, что дополнения к файлам не распространяются через слияния. То есть, ранее слияние с dev1 добавило несколько файлов, но слияние с dev1, которое включает фиксацию из предыдущего слияния, не включает добавленные файлы.

Но я все еще проверяю.

4b9b3361

Ответ 1

Следующее утверждение неверно:

Файлы, которые были добавлены в ветку и затем изменены в ветке, не добавляются при выполнении слияния по количеству ревизий.

Это означает, что слияние полностью нарушено.

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

Другая вещь, о которой нужно помнить, - это слияние с рабочей копией, а затем решить, что вы не довольны ею и все вернули, новые файлы все равно будут в рабочей копии, поэтому, если вы объедините опять же, неверсированные файлы будут препятствовать слиянию новых файлов, поэтому вы их пропустите. Таким образом, запуск "svn status" и удаление неверсированных файлов гарантируют правильное слияние.

Комментарий о добавлении пустого файла не должен быть выполнен, потому что тогда новый файл не знает, откуда он пришел. Другими словами, это не копия, поэтому "svn log" не покажет свою историю. И, наконец, если файл был гигабайтной фотографией, вы не захотите объединить его в новый файл, потому что тогда у репозитория будет две копии одного и того же контекста. Слияние и копирование с историей сохраняет хранилище хранилища (по крайней мере, до тех пор, пока не будет включено разделение реплик).

Ответ 2

Я всегда знал, что svn-предупреждения являются показателем subversion, который вы каким-то образом напортачили. Затем я столкнулся с приведенным выше случаем, когда у меня было много пропущенных файлов при слиянии с веткой, но я знал, что у меня есть правильные пути для слияния. Пропущенными файлами были все файлы, которые были добавлены, и изменения в ветке, но еще не существовали на багажнике.

Тогда я понял, что все эти файлы уже существовали, хотя и не вернулись, на моей рабочей копии туловища - я сделал тестовое слияние (а не сухой запуск) неделей ранее и вернулся, но файлы никогда не удалялись физически моим клиентом SVN. Как только я удалил их физически из моей рабочей копии ствола, проблема исчезла!

Ответ 3

Файлы, которые были добавлены в ветку и затем изменены в ветке, не добавляются при выполнении слияния по нескольким ревизиям, потому что subversion пытается применить контекст diff к файлу, который не существует в рабочем каталог (новый файл). Вы увидите предупреждение от svn, в котором указано что-то вроде "Пропуск отсутствующего файла blah.c..."

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

Другой вариант, который у вас есть, - создать пустые файлы (например, используя команду unix touch) для всех файлов, которые были добавлены в ревизии (вы можете получить список этих файлов, просто выполнив слияние с помощью - спецификатор сухого пробега и принимая во внимание все предупреждения "Пропустить отсутствующий файл" ), затем запустите слияние со всем списком ревизий (например, -r 1023: 1040). Это объединит изменения в новые пустые файлы, и все должно быть персиковым:)

Ответ 4

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

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

В этом случае вы должны просто убедиться, что файлы действительно слиты правильно и продолжают нормально.