Come sfuggire ai caratteri @ nei nomi dei file gestiti da Subversion?


191

Per molte operazioni Subversion, l'aggiunta del simbolo "@" alla fine di un file o di un argomento URL consente di scegliere come target una revisione specifica di quel file. Ad esempio, "svn info test.txt@1234" fornirà informazioni su test.txt come esisteva nella revisione 1234.

Tuttavia, quando il nome del file contiene un @, viene erroneamente interpretato da Subversion come un identificatore di revisione:

svn info 'test @ .txt' svn: errore di sintassi durante l'analisi della revisione '.txt'

Ho provato virgolette doppie e singole, oltre a scappare con '/', '\' e '@'. Come posso dire a Subversion di trattare i simboli @ come parte del nome del file?


3
Perché mai hai nomi di file con @ in loro? Chiedere guai, se me lo chiedi ... :-)
JesperE

Ottima domanda! :) Sto assumendo un progetto in cui questo personaggio è un componente fondamentale delle convenzioni di denominazione dei file e sfortunatamente questo non può essere modificato nel prossimo futuro.
Weston,

57
Apple ha creato questa convenzione per tutti i suoi sviluppatori iOS a partire da iOS 4+. Tutte le risorse dovrebbero essere denominate @ 2x se sono per un display ad alta risoluzione ...
Dimitris

2
Standard per ghetto Matlab OO vecchio stile
Chinasaur

Inoltre, se salvi la tua chiave privata o la chiave di revoca da Enigmail di Thunderbird, crea un nome file - non irragionevolmente, data l'applicazione - contenente un segno
Peter Flynn

Risposte:


283

Dal libro SVN (enfasi aggiunta):

Il lettore percettivo si sta probabilmente chiedendo a questo punto se la sintassi della revisione pegging causa problemi nel lavoro con percorsi di copia o URL che effettivamente hanno segni in essi. Dopotutto, come fa svn a sapere se news@11il nome di una directory nel mio albero o solo una sintassi per la "revisione 11 delle notizie "? Per fortuna, mentre svn assumerà sempre quest'ultimo, c'è una soluzione banale. Devi solo aggiungere un segno at alla fine del percorso , ad esempio news@11@. svn si preoccupa solo dell'ultimo segno di accesso nell'argomento, e non è considerato illegale omettere un identificatore di revisione pegging letterale dopo quello al segno. Questa soluzione alternativa si applica anche ai percorsi che terminano con un segno - che userestifilename@@per parlare di un file chiamato nomefile @ .


4
Nota che per usare "svn diff" devi aggiungere un parametro di revisione. "svn up @ file @" funziona, ma "svn diff @ file @" non funziona. Devi usare "svn diff -r HEAD @ file @"
analytik il

Nota per il libro SVN: i file possono esistere senza estensioni, anche su Windows, quindi news@11potrebbe essere anche un file.
trysis

1
Si noti che per alcuni comandi, come rinominare, un argomento può essere un elemento con versione o un nome file locale. Nel caso della ridenominazione, anche il bersaglio viene scansionato per una revisione appuntata, ma potrebbe successivamente essere trattato come un semplice nome. Per esempio, se si desidera rinominare @fooa @bar, svn rename @foo@ @barsi lamentano @bar; ma se lo fai svn rename @foo@ @bar@, il nuovo nome sarà letteralmente @bar@. Per evitare questo, aggiungere ./(o .\ su Windows) per far capire che è un percorso locale: svn rename @foo@ ./@bar.
Zastai,

82

La risposta originale è corretta, ma forse non abbastanza esplicita. Le opzioni specifiche della riga di comando unix sono le seguenti:

svn info 'image@2x.png@'

o

svn info "image@2x.png@"

o

svn info image\@2x.png\@

Ho appena provato tutti e tre.


4
Ho anche testato svn info icon@2x.png@e ha funzionato anche. Sì, senza virgolette o barre!
Nate,

La necessità di quotare dipende dalla tua shell - io uso KSH e sicuramente hai bisogno delle virgolette (poiché '@' è un segno che vuoi che un processo venga eseguito in background). YMMV a seconda della shell.
David H,

Sì. Il mio chilometraggio era in bashautostrada :)
Nate

1
@Nate Ora non posso farcela - funziona benissimo senza le virgolette in ksh. Non so perché pensassi di averne bisogno - forse qualche altro problema - era 2 anni fa che ho pubblicato questo ...
David H

14

Soluzione per aggiungere più file in diverse sottocartelle:

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

Sostituisci semplicemente "png" in " @ .png" con il tipo di file che desideri aggiungere.


assicurati di citare o sfuggire ai nomi dei tuoi file (e fai una corrispondenza senza distinzione tra maiuscole e minuscole). Inoltre non c'è alcuna necessità di trattare con i file @nel loro nome come un caso speciale, è possibile aggiungere in modo sicuro il @simbolo su tutti i nomi di file: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. inoltre, questo approccio non lascia il tuo repository svn con una struttura di file / directory incompatibile con la copia locale funzionante?
Ardnew,

l'uso execdi find potrebbe essere più piacevole:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung il

11

per aggiungere il seguente file: image@2x.png procedi come segue: svn aggiungi immagine \ @ 2x.png @


11

Aggiungi semplicemente

@

in corrispondenza del file che è necessario utilizzare, indipendentemente dal comando SVN, ad esempio:

file@2x.jpg

per

file@2x.jpg@

8

Nel mio caso, dovevo rimuovere i file da un repository SVN che conteneva un segno @:

Questo non funzionerebbe:

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

Ma questo ha fatto:

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

6

Per aggiungere più file, esiste una soluzione alternativa:

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

Per favore, spiega la tua risposta.
Hemang

3
Puoi usare awk invece di grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi,

1

Per i comandi svn con 2 argomenti come "move", è necessario aggiungere "@" solo al parametro sinistro (primo). Per esempio:

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

Questa riga è importante: $ svn sposta README @ txt @ README2 @ txt

Come puoi vedere, non è necessario aggiungere "@" in "README2 @ txt"


0

@David H

Ho appena provato un comando simile senza sfuggire ai simboli @ e funziona ancora bene

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

Questo è su GNU bash, versione 3.2.48 (1) -release (x86_64-apple-darwin10.0) e svn 1.6.16


0

L'unica soluzione che ha funzionato per me è stata la stessa proposta da @NPike

svn ripristina 'percorso / in / nomefile @ ext @'


Sei sicuro che questa dovrebbe essere una nuova risposta alla domanda originale? Questo dovrebbe piuttosto essere un voto o un commento
Nico Haase

mi dispiace, mio ​​male, non posso ancora aggiungere commenti
Jonyx4

0

Ho avuto il problema oggi con nomi di file generati da indirizzi e-mail (non una buona idea!).

Soluzione, utilizzando le printfopzioni di finded espansione della shell

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.