Почему это слияние Subversion приводит к конфликту дерева, а не к конфликту слияния?

Вопрос

Я ожидал конфликта слияния в файле a.txt, потому что его строка 2 была изменена на trunk и branch/featurex одновременно.

  1. Почему я получаю конфликт дерева вместо конфликта слияния?
  2. Как отобразить конфликт? svn diff?
  3. Как разрешить этот конфликт?

Пример воспроизведения ситуации

Чтобы воспроизвести конфликт дерева, вы можете внести изменения в trunk и branches/featurex и попытаться объединить trunk в branches/featurex.

Создайте ветку:

PS C:\> mkdir demo
PS C:\> cd demo
PS C:\demo> svnadmin create svnrepo
PS C:\demo> cd workspace
PS C:\demo\workspace> mkdir trunk
PS C:\demo\workspace> mkdir branches
PS C:\demo\workspace> mkdir tags
PS C:\demo\workspace> svn add trunk
PS C:\demo\workspace> svn add branches
PS C:\demo\workspace> svn add tags
PS C:\demo\workspace> svn ci -m "Create SVN default folders"
PS C:\demo\workspace> cd trunk
PS C:\demo\workspace\trunk> echo "trunk: line1" > a.txt
PS C:\demo\workspace\trunk> svn add .\a.txt
PS C:\demo\workspace\trunk> svn ci -m "1st commit on trunk"
PS C:\demo\workspace\trunk> svn copy . ..\branches\featurex
PS C:\demo\workspace\trunk> cd ..
PS C:\demo\workspace> cd .\branches
PS C:\demo\workspace\branches> svn ci -m "Create branch for feature x"
Adding         featurex
Adding  (bin)  featurex\a.txt

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

PS C:\demo\workspace\trunk> echo "trunk: line2" >> .\a.txt
PS C:\demo\workspace\trunk> svn ci -m "2nd commit on trunk"

Зафиксируйте изменение в ветке (в той же строке, чтобы создать конфликт слияния):

PS C:\demo\workspace\branches\featurex> svn up
PS C:\demo\workspace\branches\featurex> echo "branch: line2" >> .\a.txt
PS C:\demo\workspace\branches\featurex> svn ci -m "1st commit on branch"

Объединить ствол в ветку:

PS C:\demo\workspace\branches\featurex> svn up
PS C:\demo\workspace\branches\featurex> svn merge file:///c:/demo/svnrepo/trunk
--- Merging r2 through r5 into '.':
   C a.txt
--- Recording mergeinfo for merge of r2 through r5 into '.':
 U   .
Summary of conflicts:
  Tree conflicts: 1
PS C:\demo\workspace\branches\featurex>

И вот он: неожиданный конфликт деревьев.

Содержимое a.txt не показывает каких-либо слияний с конфликтами слияния, оно просто показывает «версию ветки» с этим содержимым:

trunk: line1
branch: line2

Версия

Версия Subversion 1.7.8 (r1419691) скомпилирована 12 декабря 2012 г., 21:11:09


person Lernkurve    schedule 26.11.2014    source источник


Ответы (1)


PS C:\demo\workspace\trunk> svn copy . ..\branches\featurex
PS C:\demo\workspace\trunk> cd ..
PS C:\demo\workspace> cd .\branches
PS C:\demo\workspace\branches> svn ci -m "Create branch for feature x"

является не правильным способом создания ветки, о чем свидетельствует тот факт, что

Adding         featurex
Adding  (bin)  featurex\a.txt

не упоминает, что это копии. Чтобы сделать их копии, источник должен быть URL-адресом репозитория (и цель тоже должна быть). Попробуйте создать ветку, используя:

PS C:\demo\workspace\trunk> svn copy -m "Create branch for feature x" "^/trunk" "^/branches/featurex"

(^ — это псевдоним корня репозитория, когда вы находитесь внутри рабочей копии) За ним следует svn update. Или, скорее, svn switch — вы не должны проверять более одной ветки, за исключением создания исходной структуры в одном коммите вместо трех!

person Jan Hudec    schedule 26.11.2014