Ошибка слияния SVN, объединение ствола с веткой и ссылка была заменена на каталог - PullRequest
1 голос
/ 25 августа 2010

Возможно, я обнаружил ошибку Subversion, и я хотел бы убедиться, что это так, прежде чем сообщать об этом.

Рассмотрим следующую последовательность действий:

Создание нового SVN-репозиторияс / trunk и / branch в нем:

~$ svnadmin create testrepo
~$ svn co file:///home/user/testrepo testwd
Checked out revision 0.
~$ cd testwd/
testwd$ svn mkdir trunk branches
A         trunk
A         branches
testwd$ svn commit
Adding         branches
Adding         trunk

Committed revision 1.
testwd$ cd ..

Проверьте рабочий каталог транка:

~$ svn co file:///home/user/testrepo/trunk testtrunkwd
Checked out revision 1.
~$ cd testtrunkwd/

Создайте новую символическую ссылку и зафиксируйте ее (предполагая, что существует /home/user/test):

testtrunkwd$ ln -s /home/user/test x
testtrunkwd$ svn add x
A         x
testtrunkwd$ svn commit
Adding         x
Transmitting file data .
Committed revision 2.

Создать ветку с именем mybranch:

testtrunkwd$ svn copy ^/trunk ^/branches/mybranch

Committed revision 3.

Удалить эту новую ссылку, зафиксировать, обновить, создать каталог с тем же именем, зафиксировать:

testtrunkwd$ svn rm x
D         x
testtrunkwd$ svn commit
Deleting       x

Committed revision 4.
testtrunkwd$ svn update
At revision 4.
testtrunkwd$ svn mkdir x
A         x
testtrunkwd$ svn commit
Adding         x

Committed revision 5.
testtrunkwd$ cd ..

Проверьте рабочий каталог ветви:

~$ svn co file:///home/user/testrepo/branches/mybranch testbranchwd
A    testbranchwd/x
Checked out revision 5.
~$ cd testbranchwd/

Объедините изменения из ствола в ветку:

testbranchwd$ svn merge ^/trunk
svn: Can't replace 'x' with a node of a differing type; the deletion must be committed and the parent updated before adding 'x'

У меня вопрос, сделал ли ячто-то не так, или это действительно ошибка Subversion.


(плохое) решение, которое я нашел для этой проблемы, состоит в объединении двух частей:
Создайте новую рабочую копию ветви:

testbranchwd$ cd ..
~$ svn co file:///home/user/testrepo/branches/mybranch testbranchwd2
A    testbranchwd2/x
Checked out revision 5.
~$ cd testbranchwd2

Объединить изменения из магистрали в точку, где была восстановлена ​​ссылка xперемещено:

testbranchwd2$ svn merge -r3:4 ^/trunk
--- Merging r4 into '.':
D    x

Зафиксируйте слияние и обновите рабочую копию ветви (без этих шагов я получаю сообщение об ошибке сверху снова при попытке слияния):

testbranchwd2$ svn commit
Sending        .
Deleting       x

Committed revision 6.
testbranchwd2$ svn update 
At revision 6.
testbranchwd2$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
A    x

И это слияние работает успешно.


Хотя это решение работает, у него есть несколько недостатков:

  • Мне понадобилось около двух дней, чтобы придумать это: ошибкасообщение вводит в заблуждение, и не совсем понятно, что должно быть сделано.
  • Это должно быть сделано для каждой ветви, которая была создана (или последний раз объединена со стволом), прежде чем ссылка была удалена, что являетсямного хлопот, если их много.
  • Это не похоже на правильное поведение для merge.Почему ветвь должна заботиться, если ссылка была заменена каталогом в транке?Ветвь просто хочет, чтобы все изменения были объединены в нее, что означает, что результат должен быть идентичен стволу, если в ветви не было сделано никаких изменений для соответствующих файлов.
  • Если это решениеПопытка в первом рабочем каталоге ветви (после ошибочного слияния) не работает.svn revert не помогает, потому что это частичное объединение оставляет рабочую копию в некотором несовместимом состоянии:
    Если svn status сделано в первой рабочей копии ветви, это результат:

    testbranchwd$ svn status
    ~ x
    И это ~ означает versioned item obstructed by some item of a different kind (согласно svn help status), который я не знаю, как исправить (слияние должно было преодолеть это).Таким образом, единственный способ (я думаю) состоит в том, чтобы получить новую рабочую копию для филиала.


Итак, есть ли лучшее решение, чем то, что я сделал?Должен ли я сообщить об ошибке?

Спасибо, Даниэль

1 Ответ

0 голосов
/ 30 августа 2010

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

Мне сказали, что в Subversion 1.7 будет полностью переписан код обработки рабочей копии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...