Почему Subversion пропускает файлы, содержащие символ @?
когда я пытаюсь выполнить команду вроде этого (из командной строки или Perl script - это не имеет значения):
svn revert "build\[email protected]"
SVN пропускает этот файл и выдает:
Skipped 'build\myfile'
Я пробовал делать:
svn revert "build\*.meta"
Но он дает тот же результат.
Я могу вернуть эти файлы из графического интерфейса. И я могу отменить эти файлы, выполнив (но он вернется больше, чем я хочу):
svn revert --recursive "build"
Есть ли обходной путь для этого?
Ответы
Ответ 1
Знаки @в именах файлов в Subversion на самом деле имеют особое значение - привязанный номер ревизии. Чтобы процитировать книгу Subversion:
Проницательный читатель, вероятно, сейчас задается вопросом, вызывает ли синтаксис ревизии привязки проблемы для рабочих путей копирования или URL-адресов, которые на самом деле имеют знаки в них. В конце концов, как svn знает, является ли news @11 именем каталога в моем дереве или просто синтаксисом для "редакции 11 новостей"? К счастью, в то время как svn всегда будет считать последнее, существует тривиальное обходное решение. Вам нужно добавить только знак в конец пути, например news @11 @. svn заботится только о последнем знаке в аргументе, и это не считается незаконным, чтобы опустить спецификатор спецификации литеральной привязки после этого при знаке. Это обходное решение применимо даже к путям, которые заканчиваются знаком "sign" - вы будете использовать filename @@для обсуждения файла с именем filename @.
Итак, вы должны добавить знак @в имена файлов в сценариях, например:
svn revert "build\[email protected]@"
Ответ 2
Чтобы добавить к правильному правилу ответ, если у вас много файлов с символом "@" в их имени, которое вы хотите обрабатывать в пакетном режиме (например, используйте * подстановочный знак), вы можете сделать что-то подобное в ОС X Terminal (или любой Linux-блок):
find . -name "*@*" | xargs -I % svn add %@
Вышеприведенная команда будет использовать утилиту find для перечисления каждого файла с @в своем имени файла, а затем передать путь к файлу в SVN с помощью XARGS. XARGS заменит каждое вхождение% на путь и добавит специальный "@" в конце имени файла, чтобы SVN принял его.
Надеюсь, что это поможет - мне пришлось немного ударить головой, чтобы добавить файлы gazzilion @2x.png, которые были необходимы для обновления моего приложения для iOS4.0
Ответ 3
Просто протестировать его правильно на окнах, используя оболочку cmd.exe, - заключая имя в двойные кавычки:
ctmkx> svn revert "trunk\[email protected]"
Reverted 'trunk\[email protected]'
Ответ 4
Какая операционная система? Если это * nix-система, попробуйте указать свой файл с помощью "одиночных @кавычек".