Возможно, я обнаружил ошибку 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
), который я не знаю, как исправить (слияние должно было преодолеть это).Таким образом, единственный способ (я думаю) состоит в том, чтобы получить новую рабочую копию для филиала.
Итак, есть ли лучшее решение, чем то, что я сделал?Должен ли я сообщить об ошибке?
Спасибо, Даниэль