Все работает как надо, по крайней мере, в SVN 1.6.11 и выше. Тем не менее, процесс сборки вполне может оставить невидимые файлы. Они могут быть прозрачными в «svn status» из-за настроек SVNIGNORE. Это может вызвать проблемы, когда ожидается, что svn удалит весь каталог.
Я провел некоторое тестирование - я установил новый и пустой репозиторий, создал там ствол и каталоги тегов, добавил один и один файл, помечая его. (приведенные ниже разделы кода не включают вывод и ошибки, выдаваемые SVN, рекомендуется скопировать его в окно терминала и посмотреть, сможете ли вы продублировать поведение).
mkdir /tmp/workdir/
cd /tmp/workdir
svnadmin create /tmp/foobar
svn checkout file:///tmp/foobar/
svn mkdir foobar/tags
svn mkdir foobar/trunk
cd foobar
svn commit -m "trunk and tags"
## NOTE: in svn 1.8 and higher, it's needed with a --ignore-ancestry option below
svn switch file:///tmp/foobar/trunk
(и здесь мы уже можем видеть, что все происходит правильно - удаление тегов и подкаталогов транка)
touch file1
svn add file1
svn commit -m "added file1"
svn cp -m "file1 in tag1" . file:///tmp/foobar/tags/tag1
А потом снова ...
touch file2
svn add file2
svn commit -m "added file2"
svn cp -m "file2 in tag2" . file:///tmp/foobar/tags/tag2
Давайте явно удалим file1 из tag3
svn rm file1
svn commit -m "deleted file1"
svn cp -m "file1 removed from tag3" file:///tmp/foobar/trunk/ file:///tmp/foobar/tags/tag3/
... а также новый каталог ...
svn mkdir dir1
touch dir1/file3
svn add dir1/file3
svn commit -m "added dir1/file3"
svn cp -m "dir1/file3 in tag4" file:///tmp/foobar/trunk file:///tmp/foobar/tags/tag4/
... и давайте удалим его в tag5 ...
svn rm dir1
svn commit -m "removed dir1/file3"
svn cp -m "dir1/file3 removed in tag5" file:///tmp/foobar/trunk file:///tmp/foobar/tags/tag5/
... и давайте проверим, как работает переключение ...
svn switch file:///tmp/foobar/tags/tag1
svn switch file:///tmp/foobar/tags/tag2
svn switch file:///tmp/foobar/tags/tag3
svn switch file:///tmp/foobar/tags/tag4
svn switch file:///tmp/foobar/tags/tag5
svn switch file:///tmp/foobar/tags/tag4
... никаких проблем вообще. Но, скажем, я изменил dir1 / file3 с помощью emacs - обычно он создает резервную копию:
touch dir1/file3~
Это не отображается в «svn status» из-за настроек SVNIGNORE по умолчанию ...
svn status
Но достаточно разбить вещи:
svn switch file:///tmp/foobar/tags/tag5
svn status
svn switch file:///tmp/foobar/tags/tag4
Первая команда указывает, что dir1 удален, но из-за непредвиденного файла каталог становится стоящим.
"svn revert", к сожалению, не удаляет непредвиденные файлы ...
svn revert -R .
svn switch file:///tmp/foobar/tags/tag5
svn status
svn switch file:///tmp/foobar/tags/tag4
"make clean" может работать, а может и не работать, в зависимости от окружающей среды. Конечно, можно создать сценарий для его удаления, например, так:
rm -rf $(svn status --no-ignore | grep -E '^\?' | awk ' { print $2 ; }')
svn switch file:///tmp/foobar/tags/tag4
Обратите внимание, что приведенная выше команда может привести к ошибкам при обнаружении имен файлов с пробелами.
Можно также избежать некоторых сообщений об ошибках выше, используя "--force":
touch dir1/file3~
svn switch --force file:///tmp/foobar/tags/tag5
svn switch --force file:///tmp/foobar/tags/tag4
Обратите внимание, что mydir1 / file3 ~ никогда не удаляется, но последний выключатель не выйдет из строя