Como escapar de caracteres @ nos nomes de arquivos gerenciados pelo Subversion?

191

Para muitas operações do Subversion, anexar o símbolo '@' ao final de um arquivo ou argumento de URL permite direcionar 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 sintaxe ao analisar a revisão '.txt'

Tentei aspas duplas e simples, além de escapar com '/', '\' e '@'. Como posso dizer ao Subversion para tratar os símbolos @ como parte do nome do arquivo?

Weston
fonte
3
Por que diabos você tem nomes de arquivos com @ neles? Pedindo problemas, se você me perguntar ...:
JesperE 16/04
Muito boa pergunta! :) Estou assumindo um projeto em que esse personagem é um componente fundamental das convenções de nomenclatura de arquivos e, infelizmente, isso não pode ser alterado no futuro próximo.
218 weston
57
A Apple criou esta convenção para todos os seus desenvolvedores de iOS a partir do iOS 4+. Todos os ativos devem ser nomeados @ 2x se eles são para uma exibição res alta ...
Dimitris
2
Padrão para gueto de estilo antigo Matlab OO
Chinasaur
Além disso, se você salvar sua chave privada ou revogação de Enigmail do Thunderbird, ele cria um nome de arquivo - não sem razão, dada a aplicação - contendo um sinal de arroba
Peter Flynn

Respostas:

283

Do livro SVN (ênfase adicionada):

O leitor perspicaz provavelmente está se perguntando, neste momento, se a sintaxe da revisão de peg causa problemas para caminhos de cópia de trabalho ou URLs que realmente têm sinais neles. Afinal, como o svn sabe se news@11é o nome de um diretório na minha árvore ou apenas uma sintaxe para a "revisão 11 das notícias "? Felizmente, embora o svn sempre assuma o último, existe uma solução trivial. Você só precisa acrescentar um sinal de arroba no final do caminho , como news@11@. svn se importa apenas com o último sinal de arroba no argumento, e não é considerado ilegal omitir um especificador de revisão de peg literal depois dele. Essa solução alternativa se aplica a caminhos que terminam em um sinal de arroba - você usariafilename@@para falar sobre um arquivo chamado filename @ .

Rob Kennedy
fonte
4
Observe que, para usar "svn diff", você precisa adicionar o parâmetro de revisão. "svn up @ file @" funciona, mas "svn diff @ file @" não funciona. Você precisa usar "svn diff -r HEAD @ file @"
analytik
Nota para o livro SVN: os arquivos podem existir sem extensões, mesmo no Windows, e também news@11podem ser um arquivo.
trysis
1
Observe que, para alguns comandos, como renomear, um argumento pode ser um item com versão ou um nome de arquivo local. No caso de renomear, o destino também é verificado para uma revisão fixada, mas pode ser tratado posteriormente como um nome simples. Por exemplo, se você deseja renomear @foopara @bar, svn rename @foo@ @barirá reclamar @bar; mas se você conseguir svn rename @foo@ @bar@, o novo nome será literalmente @bar@. Para evitar isso, adicione ./(ou .\ no Windows) para deixar claro que é um caminho local: svn rename @foo@ ./@bar.
Zastai 23/10/19
82

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

svn info '[email protected]@'

ou

svn info "[email protected]@"

ou

svn info image\@2x.png\@

Acabei de testar todos os três.

David H
fonte
4
Eu também testei svn info [email protected]@e funcionou também. Sim, sem aspas ou barras!
Nate
A necessidade de citar depende do seu shell - eu uso o KSH e com certeza você precisa das aspas (como '@' é um sinal de que você deseja que um processo seja executado em segundo plano). YMMV dependendo da casca.
21713 David
Sim. Minha milhagem estava na bashestrada :)
Nate
1
@ Nate Agora não posso fazê-lo falhar - está funcionando bem sem as aspas no ksh. Eu não sei por que pensei que precisava deles - talvez alguma outra questão - foi há 2 anos que publiquei isso ... #
David H
14

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

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

Apenas substitua o "png" em " @ .png" pelo tipo de arquivo que você deseja adicionar.

Lcsky
fonte
lembre-se de citar ou escapar dos nomes dos arquivos (e faça a correspondência sem distinção entre maiúsculas e minúsculas). Também não há necessidade de arquivos Tratar com @em seu nome como um caso especial, você pode anexar com segurança o @símbolo para todos os nomes de arquivos: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. Além disso, essa abordagem não deixa seu repositório svn com uma estrutura de arquivo / diretório inconsistente com a cópia local de trabalho?
11113 ardnew
usando execde encontrar pode ser ansioso:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung
11

para adicionar o seguinte arquivo: [email protected], faça o seguinte: svn add image \ @ 2x.png @

Malek Belkahla
fonte
8

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

Isso não funcionaria:

svn remove 'src/assets/images/hi_res/[email protected]'

Mas isso fez:

svn remove 'src/assets/images/hi_res/[email protected]@'
NPike
fonte
6

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

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
liruqi
fonte
Por favor, explique sua resposta.
Hemang
3
Você pode usar o awk em vez do grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi
1

Para comandos svn com 2 argumentos como "move", você deve acrescentar "@" apenas no parâmetro esquerdo (primeiro). 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 anexar "@" em "README2 @ txt"

Srdjan
fonte
0

@David H

Eu apenas tentei um comando semelhante sem escapar dos símbolos @ e ainda funciona bem

svn ci splash.png [email protected]@

Isto está no GNU bash, versão 3.2.48 (1) -release (x86_64-apple-darwin10.0) e svn 1.6.16

Qazzian
fonte
0

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

svn revert 'caminho / para / nome do arquivo @ ext @'

Jonyx4
fonte
Tem certeza de que essa deve ser uma nova resposta à pergunta original? Este deve sim ser um upvote ou comentário
Nico Haase
Desculpe, meu mau, eu não posso adicionar comentário ainda
Jonyx4
0

Hoje tive o problema com nomes de arquivos gerados a partir de endereços de e-mail (não é uma ideia muito boa!).

Solução, usando printfopções de findexpansão de shell

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