Pour de nombreuses opérations Subversion, l'ajout du symbole '@' à la fin d'un fichier ou d'un argument d'URL vous permet de cibler une révision spécifique de ce fichier. Par exemple, "svn info test.txt@1234" donnera des informations sur test.txt tel qu'il existait dans la révision 1234.
Cependant, lorsque le nom du fichier contient un @, il est interprété de manière incorrecte par Subversion en tant que spécificateur de révision:
svn info 'test @ .txt' svn: erreur de syntaxe lors de l'analyse de la révision '.txt'
J'ai essayé les guillemets simples et doubles, ainsi que l'échappement avec '/', '\' et '@'. Comment puis-je dire à Subversion de traiter les symboles @ dans le nom du fichier?
Du livre SVN (italiques ajoutés):
Le lecteur perspicace se demande probablement à ce stade si la syntaxe de révision de rattachement pose des problèmes pour les chemins de copie de travail ou les URL contenant réellement des signes. Après tout, comment svn sait-il si
news@11
est le nom d'un répertoire dans mon arbre ou juste une syntaxe pour “révision 11 de news”? Heureusement, alors que svn assumera toujours ce dernier point, il existe une solution de contournement triviale. Il vous suffit d'ajouter un signe ar à la fin du chemin , tel quenews@11@
. svn ne s'intéresse qu'au dernier signe dans l'argument, et il n'est pas considéré illégal d'omettre un spécificateur de révision de rattachement de rattachement littéral après ce signe. Cette solution de contournement s’applique même aux chemins qui se terminent par un arobase (vous utiliseriezfilename@@
pour parler d'un fichier nommé filename @.
La réponse initiale est correcte, mais peut-être pas assez explicite. Les options de ligne de commande unix particulières sont les suivantes:
svn info '[email protected]@'
ou
svn info "[email protected]@"
ou
svn info image\@2x.png\@
Je viens de tester les trois.
Solution pour ajouter plusieurs fichiers dans différents sous-dossiers:
for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done
Il suffit de remplacer le "png" dans "@. Png" par le type de fichiers que vous souhaitez ajouter.
pour ajouter le fichier suivant: [email protected], procédez comme suit: svn add image\@ 2x.png @
Ajoutez simplement
@
au niveau du fichier que vous devez utiliser, quelle que soit la commande SVN, par exemple:
[email protected]
à
[email protected]@
Dans mon cas, je devais supprimer les fichiers d'un dépôt SVN contenant un signe @:
Cela ne marcherait pas:
svn remove 'src/assets/images/hi_res/[email protected]'
Mais cela a:
svn remove 'src/assets/images/hi_res/[email protected]@'
Pour ajouter plusieurs fichiers, il existe une solution alternative:
svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
Pour les commandes svn avec 2 arguments comme "move", vous devez ajouter "@" niquement au paramètre left (first). Par exemple:
$ 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.
Cette ligne est importante: $ svn move README @ txt @ README2 @ txt
Comme vous pouvez le constater, nous n'avons pas besoin d'ajouter "@" à "README2 @ txt"
@ David H
Je viens d'essayer une commande similaire sans échapper aux symboles @ et cela fonctionne toujours bien
svn ci splash.png [email protected]@
C'est sur GNU bash, version 3.2.48 (1) -release (x86_64-Apple-darwin10.0) et svn 1.6.16
J'ai eu le problème aujourd'hui avec les noms de fichiers générés à partir d'adresses e-mail (pas une très bonne idée!).
Solution utilisant printf
options de find
et expansion Shell
svn add $(find . -name "*@*.png" -printf "%p@ ")
La seule solution qui a fonctionné pour moi était la même que celle suggérée par @NPike
svn revert 'chemin/en/nom du fichier @ ext @'