Почему я получаю конфликты деревьев в Subversion?

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

Я не думаю, что они должным образом помечены.

Ответ 1

Я нашел решение, читающее ссылку, которую дал Гэри (и я предлагаю следовать этому пути).

Подводя итог, чтобы разрешить конфликт дерева , заключающий ваш рабочий каталог с SVN-клиентом 1.6.x, вы можете использовать:

svn resolve --accept working -R .

где . - это каталог в конфликте.

ПРЕДУПРЕЖДЕНИЕ: "Выполнение вашей рабочей директории" означает, что ваша песочница будет той, которую вы совершаете, поэтому, если вы удалили какой-либо файл из своей песочницы, они будут удалены из репозиторий тоже. Это относится только к конфликтующему каталогу.

Таким образом, мы предлагаем SVN разрешить конфликт (--resolve), принимая рабочую копию внутри вашей песочницы (--accept working), рекурсивно (-R), начиная с текущего каталога (.).

В TortoiseSVN, выбрав "Разрешено" по правому клику, на самом деле решает эту проблему.

Ответ 2

Subversion 1.6 добавил конфликты дерева для конфликтов на уровне каталогов. Хорошим примером может быть то, когда вы локально удаляете файл, а затем обновление пытается сменить текст на этот файл. Другое дело, когда у вас есть подрывная деятельность Переименование файла, который вы редактируете, поскольку это действие Add/Delete.

В блоге Subabersion CollabNet есть отличная статья о Контексты дерева.

Ответ 3

По моему опыту SVN создает конфликт дерева, КОГДА я удаляю папку. Кажется, нет причин.

Я единственный, кто работает над своим кодом → удалите каталог → commit → конфликт!

Я не могу дождаться перехода на Git.

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

Ответ 4

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

Пример:

Объединить/svn/Project/branch/some-branch/Источники to/svn/Project/trunk --- > Конфликт деревьев

Объединить/svn/Проект/ветки/некоторая ветвь to/svn/Project/trunk --- > OK

Это может быть глупой ошибкой, но это не всегда очевидно, потому что вы думаете, что это нечто более сложное.

Ответ 5

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

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

Чтобы избежать этого, нужно сделать специальное слияние, реинтеграцию. Вы можете добиться этого с --reintegrate переключателя --reintegrate.

Вы можете прочитать об этом в документации: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

Однако при объединении вашей ветки обратно в ствол базовая математика сильно отличается. Ваша ветвь функций теперь представляет собой путаницу как дублированных изменений ствола, так и изменений частной ветки, поэтому нет простого непрерывного диапазона ревизий для копирования. Указав опцию --reintegrate, вы просите Subversion тщательно реплицировать только те изменения, которые уникальны для вашей ветки. (И на самом деле, он делает это, сравнивая последнее ствол дерева с последним деревом ветвей: результирующая разница - это именно ваши изменения веток!)

После реинтеграции ветки настоятельно рекомендуется удалить ее, в противном случае вы будете продолжать получать конфликты деревьев при каждом слиянии в другом направлении: от ствола к вашей ветке. (По той же причине, что и описанная ранее.)

Есть способ обойти это тоже, но я никогда не пробовал. Вы можете прочитать это в этом посте: Реинтеграция ветки Subversion в v1.6

Ответ 6

Это может быть вызвано тем, что не используют одни и те же клиенты версии.

Использование клиента версии 1.5 и клиента версии 1.6 для одного и того же репозитория может создать такую ​​проблему. (Я был просто укушен.)

Ответ 7

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

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

Это может произойти, по крайней мере, на 1.4 репозиториях, я не уверен, помогает ли здесь слияние в 1.5.

Ответ 8

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

Я решил проблему, переместив файл назад, совершив, а затем сменив свою ветку. Затем я перенес файл обратно.:) Это похоже на трюк.

Ответ 9

У меня была аналогичная проблема. Единственное, что действительно работало для меня, это удалить конфликтующие подкаталоги с помощью:

svn delete --force ./SUB_DIR_NAME

Затем скопируйте их снова из другого корневого каталога в рабочей копии, в которой есть:

svn copy ROOT_DIR_NAME/SUB_DIR_NAME

Тогда do

svn cleanup

и

svn add *

Вы можете получить предупреждения с последним, но просто проигнорировать их и, наконец,

svn ci .

Ответ 10

У меня была такая же проблема, и разрешил ее, повторно выполнив слияние с помощью этих инструкций. В основном, он использует SVN "2-URL merge" для обновления trunk до текущего состояния вашей ветки, не беспокоясь о конфликтах истории и дерева. Сохранял меня от ручной фиксации конфликтов 114 деревьев.

Я не уверен, сохранит ли он историю, как хотелось бы, но она того стоила в моем случае.

Ответ 11

Сценарий, с которым я иногда сталкиваюсь:

Предположим, что у вас есть соединительная линия, из которой вы создали ветвь релиза. После некоторых изменений на соединительной линии (в частности, для создания каталога "some-dir" ) вы создаете ветвь функции/исправления, которую вы хотите позже объединить в ветвь выпуска (поскольку изменения были достаточно малы, а функция/исправление важна для выпуска).

trunk -- ... -- create "some-dir" -- ...
     \                                  \-feature/fix branch
      \- release branch

Если вы попытаетесь объединить ветвь функции/исправить непосредственно в ветки релиза, вы получите конфликт дерева (даже если каталог вообще не существует в ветке feature/fix):

svn status
!     C some-dir
      >   local missing or deleted or moved away, incoming file edit upon merge

Таким образом, вам нужно явно объединить коммиты, которые были сделаны на соединительной линии, прежде чем создавать ветку функций/исправлений, которая создала каталог "some-dir", прежде чем слияние ветки feature/fix.

Я часто забываю, что это не нужно в git.

Ответ 12

До сегодняшнего дня, по крайней мере, 3 месяца назад, я регулярно сталкивался с сотнями конфликтов деревьев при попытке объединить ветку обратно в ствол (используя TortoiseSVN 1.11). Будь перебазирован или нет, кстати. Я использую TortoiseSVN начиная с его версии 1, еще в 2004 году, и я все время реинтегрировал ветки. Наверное, что-то случилось недавно?

Итак, сегодня я провел этот простой эксперимент и обнаружил, что создавало эти сумасшедшие конфликты:

  1. Я раздвоил багажник @393;
  2. Я изменял десятки файлов случайным образом, а также создавал новые;
  3. Я совершил. Теперь @395 (коллега раскошелился на 394, чтобы исполнить свои собственные вещи).
  4. Затем я попытался реинтегрировать ветку обратно в ствол, только тест; Следуя рекомендациям TortoiseSVN в мастере: "Чтобы объединить все ревизии (реинтегрировать), оставьте это поле пустым". Чтобы добиться этого, я щелкнул правой кнопкой мыши на папке ствола и выбрал "TortoiseSVN> Merge, from/path/to/branch", и оставил диапазон оборотов пустым, как советовалось в диалоговом окне.

Обсуждение: (см. Вложение)

все ревизии... чего? Мало ли я знал, что клиент, должно быть, имел в виду " все ревизии цели! (Транк)", так как в процессе реинтеграции этой ветки я увидел упоминание "Слияние ревизий 1-HEAD"! О, МОЙ БОГ. Бедный дьявол, ты погиб здесь. Та ветка родилась @393, не могли бы вы прочитать свидетельство о рождении, ради бога? this is why so many conflicts occurred: SVN-cli is going on a foolish spree from revision 1

Разрешение:

  1. Вопреки тому, что советовал волшебник, укажите диапазон, который охватывает ВСЕ ревизии... жизни ветвления! следовательно, 394-ГОЛОВА;
  2. Теперь снова запустите тест слияния и возьмите сигару. (see second attachment).

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