Как экранировать символы @ в именах файлов, управляемых Subversion? - PullRequest
188 голосов
/ 16 апреля 2009

Для многих операций Subversion добавление символа '@' в конец аргумента файла или URL-адреса позволяет вам указать конкретную версию этого файла. Например, «svn info test.txt@1234» предоставит информацию о test.txt в том виде, в каком он существовал в редакции 1234.

Однако, если имя файла содержит символ @, Subversion неправильно интерпретирует его как спецификатор ревизии:

svn info 'test @ .txt' svn: синтаксическая ошибка при разборе ревизии '.txt'

Я пробовал двойные и одинарные кавычки, а также экранирование с помощью «/», «\» и «@». Как я могу сказать Subversion обрабатывать символы @ как часть имени файла?

Ответы [ 11 ]

278 голосов
/ 16 апреля 2009

Из книги SVN (выделение добавлено):

В этот момент проницательный читатель, вероятно, задается вопросом, не вызывает ли синтаксис редакции разметки проблемы с путями рабочих копий или URL, которые на самом деле имеют знаки в них. В конце концов, как svn узнает, является ли news@11 именем каталога в моем дереве или просто синтаксисом для «revision 11 of news »? К счастью, хотя svn всегда будет предполагать последнее, существует тривиальный обходной путь. Вам нужно только добавить знак в конце пути , например news@11@. svn заботится только о последнем знаке в аргументе, и не считается недопустимым опускать буквенный спецификатор ревизии колышка после этого в знаке. Этот обходной путь даже применяется к путям, которые заканчиваются знаком at - вы бы использовали filename@@, чтобы поговорить о файле с именем filename@.

82 голосов
/ 22 февраля 2011

Оригинальный ответ правильный, но, возможно, недостаточно точный. Конкретные параметры командной строки Unix:

svn info 'image@2x.png@'

или

svn info "image@2x.png@"

или

svn info image\@2x.png\@

Я только что проверил все три.

14 голосов
/ 06 сентября 2012

Решение для добавления нескольких файлов в разные подпапки:

for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done

Просто замените "png" в "@.png" на файлы, которые вы хотите добавить.

11 голосов
/ 16 декабря 2010

, чтобы добавить следующий файл: image@2x.png сделайте следующее: svn add image \ @ 2x.png @

9 голосов
/ 25 июля 2017

Просто добавьте

@

в файле, который вам нужно использовать, независимо от того, какая это команда SVN, например ::100100

file@2x.jpg

до

file@2x.jpg@
8 голосов
/ 23 сентября 2011

В моем случае мне нужно было удалить файлы из репозитория SVN, содержащие знак @:

Это не сработает:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png'

Но это сделал:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png@'
5 голосов
/ 23 июля 2015

Чтобы добавить несколько файлов, есть альтернативное решение:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
1 голос
/ 20 февраля 2014

Для команд svn с 2 аргументами, такими как «move», вы должны добавить «@» only в левый (первый) параметр. Например:

$ svn add README@txt@
A         README@txt

$ svn move README@txt@ README2@txt
A         README2@txt
D         README@txt


$ svn status
A       README2@txt

$ svn commit -m "blah"
Adding         README2@txt
Transmitting file data .
Committed revision 168.

$ svn delete README2@txt@
D         README2@txt

$ svn commit -m "blahblah"
*Deleting       README2@txt

Committed revision 169.

Эта строка важна: $ svn move README @ txt @ README2 @ txt

Как видите, нам не нужно добавлять "@" в "README2 @ txt"

0 голосов
/ 19 апреля 2018

У меня сегодня была проблема с именами файлов, сгенерированными из адресов электронной почты (не очень хорошая идея!).

Решение с использованием printf опций find и расширения оболочки

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
0 голосов
/ 05 марта 2018

Единственное решение, которое мне помогло, было предложено @NPike

svn revert 'path / to / filename @ ext @'

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