SVN Switch не удаляет папки / файлы в работе, которых нет при переходе на тег или ветку - PullRequest
7 голосов
/ 03 февраля 2011

У меня есть требование сделать сборку на основе тега или ветки.Поэтому я автоматизировал процесс сборки, чтобы переключаться на тег или ветку всякий раз, когда они запрашивают сборки.Я использую команду svn switch, чтобы рабочая копия указывала на тег или ветвь из рабочей копии транка.Проблема заключается в следующем: если в ревизии заголовка присутствуют новые добавленные папки, они не удаляются из рабочей копии.Они остаются как неверсированные в рабочей копии, но неверсированные папки в сборке вызывают много проблем.Как избежать этой проблемы?Есть ли возможность избежать неверсионных файлов при использовании команды svn switch.

Ответы [ 4 ]

4 голосов
/ 07 июня 2013

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

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

Я только что проверил это с помощью недавно созданного тестового репозитория. С другой стороны, если в текущем рабочем пространстве есть локальные изменения, svn не будет их отбрасывать. SVN довольно консервативен в этом отношении. Например. Я создал каталог dir на транке и зафиксировал его. Затем я создал файл резервной копии dir/file.~1~. Это не было сообщено svn st, потому что *~ глобально игнорируется моим конфигом. Когда я переключился обратно на ветку, svn должен был удалить dir, но это бы удалило файл резервной копии, поэтому svn не сделал этого. Он сохранил каталог как локальную модификацию.

примечание: при повторном переключении на транк svn сообщил об ошибке, так как dir, поскольку локальная модификация на ветви конфликтовала с версией dir на транке. --force решил эту проблему.

2 голосов
/ 07 июня 2013

Все работает как надо, по крайней мере, в 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 ~ никогда не удаляется, но последний выключатель не выйдет из строя

2 голосов
/ 03 февраля 2011

SVN-переключатель не удалит неверсионные файлы, которые вы нашли.

То, как я справляюсь с этим в процессе сборки (Cruise Control), заключается в том, чтобы всегда удалять всю рабочую папку после каждой сборки. Затем, когда ваш процесс сборки получит SVN, он окажется в пустом каталоге и не будет никаких конфликтов.

Кстати, именно поэтому вам следует использовать отдельный сервер сборки - тогда у вас не будет незавершенной работы разработчика, мешающей сборке.

1 голос
/ 19 февраля 2013

Два года спустя ...

После некоторого возни с вопросом о вашем вопросе (Сэнди) ответ: да, коммутатор должен удалить каталог.У меня возникла та же проблема, и я понял ее.

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

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

...