Como escaping de caracteres @ em nomes de arquivos gerenciados pelo Subversion?

Para muitas operações do Subversion, acrescentar o símbolo ‘@’ ao final de um argumento de arquivo ou URL permite que você direcione uma revisão específica desse arquivo. Por exemplo, “svn info test.txt@1234″ fornecerá informações sobre o test.txt como ele existia na revisão 1234.

No entanto, quando o nome do arquivo contém um @, ele é interpretado incorretamente pelo Subversion como um especificador de revisão:

svn info ‘test @ .txt’ svn: Erro de syntax analisando a revisão ‘.txt’

Eu tentei aspas duplas e simples, bem como escaping com ‘/’, ‘\’ e ‘@’. Como posso dizer ao Subversion para tratar os símbolos @ como parte do nome do arquivo?

Do livro do SVN (ênfase adicionada):

O leitor perspicaz provavelmente está se perguntando, neste ponto, se a syntax da revisão de rastreio causa problemas para caminhos de cópia de trabalho ou URLs que realmente possuem sinais nos mesmos. Afinal, como o svn sabe se news@11 é o nome de um diretório em minha tree ou apenas uma syntax para “revisão 11 de notícias ”? Felizmente, enquanto o svn sempre assumirá o último, existe uma solução trivial. Você precisa apenas append um sinal de arroba no final do caminho , como news@11@ . svn se importa apenas com o último sinal no argumento, e não é considerado ilegal omitir um especificador de revisão de indexação literal depois disso no sinal. Essa solução alternativa se aplica até mesmo aos caminhos que terminam em um arroba — você usaria o filename@@ para falar sobre um arquivo denominado filename @ .

A resposta original está correta, mas talvez não seja explícita o suficiente. As opções específicas da linha de comandos do unix são as seguintes:

 svn info 'image@2x.png@' 

ou

 svn info "image@2x.png@" 

ou

 svn info image\@2x.png\@ 

Eu acabei de testar todos os três.

Solução para adicionar vários arquivos em diferentes subpastas:

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

Basta replace o “png” em ” @ .png” para o tipo de arquivos que você deseja adicionar.

para adicionar o seguinte arquivo: image@2x.png faça o seguinte: svn add image \ @ 2x.png @

No meu caso, eu precisava remover arquivos de um repository SVN que continha um sinal @:

Isso não funcionaria:

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

Mas isso fez:

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

Para adicionar vários arquivos, existe uma solução alternativa:

 svn status | grep \.png | awk '{print $2"@"}'| xargs svn add 

Basta adicionar

@

no arquivo que você precisa usar, não importa o comando SVN, por exemplo:

 file@2x.jpg 

para

 file@2x.jpg@ 

Para comandos svn com 2 argumentos como “move”, você deve append “@” apenas no parâmetro left (first). Por exemplo:

 $ 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. 

Esta linha é importante: $ svn move README @ txt @ README2 @ txt

Como você pode ver, não precisamos acrescentar “@” em “README2 @ txt”

@ David H

Eu apenas tentei um comando similar sem escaping dos símbolos @ e ainda funciona bem

 svn ci splash.png splash@2x.png@ 

Isso é no bash do GNU, versão 3.2.48 (1) -release (x86_64-apple-darwin10.0) e svn 1.6.16

A única solução que funcionou para mim foi a mesma sugerida pela @NPike

svn revert ‘caminho / para / nome do arquivo @ ext @’

Eu tive o problema hoje com nomes de arquivos gerados a partir de endereços de e-mail (não é uma boa idéia!).

Solução, usando opções de printf de find e expansão de shell

  svn add $(find . -name "*@*.png" -printf "%p@ ")