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?


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


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 'image@2x.png@'

ou

svn info "image@2x.png@"

ou

svn info image\@2x.png\@

Acabei de testar todos os três.


4
Eu também testei svn info icon@2x.png@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.


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: image@2x.png, faça o seguinte: svn add image \ @ 2x.png @


11

Basta adicionar

@

no arquivo que você precisa usar, independentemente do comando SVN, por exemplo:

file@2x.jpg

para

file@2x.jpg@

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/locales-usa@2x.png'

Mas isso fez:

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

6

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

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

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"


0

@David H

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

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

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


0

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

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


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@ ")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.