Comment échapper les caractères @ dans les noms de fichiers gérés par Subversion?

191

Pour de nombreuses opérations Subversion, l'ajout du symbole «@» à la fin d'un fichier ou d'un argument 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 telles qu'elles existaient dans la révision 1234.

Cependant, lorsque le nom du fichier contient un @, il est incorrectement interprété par Subversion comme un 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é des guillemets doubles et simples ainsi que des échappements avec «/», «\» et «@». Comment puis-je dire à Subversion de traiter les symboles @ comme faisant partie du nom de fichier?

Weston
la source
3
Pourquoi diable avez-vous des noms de fichiers avec @ dedans? Demander des ennuis, si vous me demandez ... :-)
JesperE
Très bonne question! :) Je reprends un projet où ce caractère est un élément fondamental des conventions de dénomination des fichiers et malheureusement cela ne peut pas être changé dans un proche avenir.
weston le
57
Apple a créé cette convention pour tous ses développeurs iOS à partir d'iOS 4+. Tous les éléments doivent être nommés @ 2x s'ils sont destinés à un affichage haute résolution ...
Dimitris
2
Standard for ghetto old-style Matlab OO
Chinasaur
De plus, si vous enregistrez votre clé privée ou votre clé de révocation à partir d'Enigmail de Thunderbird, cela crée un nom de fichier - pas déraisonnablement, étant donné l'application - contenant un arobase
Peter Flynn

Réponses:

283

Extrait du livre SVN (italiques ajoutés):

Le lecteur perspicace se demande probablement à ce stade si la syntaxe de révision de cheville pose des problèmes pour les chemins de copie de travail ou les URL qui ont en fait des signes at. Après tout, comment svn sait-il s'il news@11s'agit du nom d'un répertoire dans mon arborescence ou simplement d'une syntaxe pour la «révision 11 de news »? Heureusement, bien que svn assume toujours ce dernier, il existe une solution de contournement triviale. Il vous suffit d'ajouter un signe arobase à la fin du chemin , tel que news@11@. svn ne se soucie que du dernier signe arobase de l'argument, et il n'est pas considéré comme illégal d'omettre un spécificateur de révision de cheville littéral après ce signe arobase. Cette solution de contournement s'applique même aux chemins d'accès qui se terminent par un arobase - vous utiliseriezfilename@@pour parler d'un fichier nommé filename @ .

Rob Kennedy
la source
4
Notez que pour utiliser "svn diff", vous devez ajouter un paramètre de révision. "svn up @ file @" fonctionne, mais "svn diff @ file @" ne fonctionne pas. Vous devez utiliser "svn diff -r HEAD @ file @"
analytik
Remarque pour le livre SVN: les fichiers peuvent exister sans extensions, même sous Windows, il news@11peut donc également s'agir d'un fichier.
trysis le
1
Notez que pour certaines commandes, comme renommer, un argument peut être un élément versionné ou un nom de fichier local. Dans le cas d'un changement de nom, la cible est également analysée pour une révision épinglée, mais elle pourrait ensuite être traitée comme un nom simple. Par exemple, si vous souhaitez renommer @fooen @bar, svn rename @foo@ @barse plaindra de @bar; mais si vous le faites svn rename @foo@ @bar@, le nouveau nom sera littéralement @bar@. Pour éviter cela, ajoutez ./(ou .\ sur les fenêtres) pour le rendre clair c'est un chemin d' accès local: svn rename @foo@ ./@bar.
Zastai
82

La réponse originale 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.

David H
la source
4
J'ai également testé svn info [email protected]@et cela a fonctionné aussi. Oui, pas de guillemets ni de barres obliques!
Nate
La nécessité de citer dépend de votre shell - j'utilise KSH et c'est sûr que vous avez besoin des guillemets (car «@» est un signe que vous voulez qu'un processus s'exécute en arrière-plan). YMMV selon la coque.
David H
Oui. Mon kilométrage était sur l' bashautoroute :)
Nate
1
@Nate Maintenant, je ne peux pas le faire échouer - cela fonctionne bien sans les guillemets dans ksh. Je ne sais pas pourquoi je pensais en avoir besoin - peut-être un autre problème - c'était il y a 2 ans que j'ai posté ceci ...
David H
14

Solution pour ajouter plusieurs fichiers dans différents sous-dossiers:

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

Remplacez simplement le "png" dans " @ .png" par le type de fichier que vous souhaitez ajouter.

Lcsky
la source
assurez-vous de citer ou d'échapper les noms de vos fichiers (et de faire des correspondances insensibles à la casse). aussi il n'y a pas besoin de fichiers de traiter avec @leur nom comme un cas particulier, vous pouvez en toute sécurité ajouter le @symbole sur tous les noms de fichiers: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. De plus, cette approche ne laisse-t-elle pas votre dépôt svn avec une structure de fichiers / répertoires incompatible avec la copie locale de travail?
ardnew
l'utilisation execde find pourrait être plus facile:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung
12

Ajoutez simplement

@

à la du fichier que vous devez utiliser, quelle que soit la commande SVN, par exemple:

[email protected]

à

[email protected]@
Alejandro Pablo Tkachuk
la source
8

Dans mon cas, j'avais besoin de supprimer des fichiers d'un dépôt SVN contenant un signe @:

Cela ne fonctionnerait pas:

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

Mais cela a fait:

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

Pour ajouter plusieurs fichiers, il existe une solution alternative:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
liruqi
la source
Veuillez expliquer votre réponse.
Hemang
3
Vous pouvez utiliser awk au lieu de grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi
1

Pour les commandes svn avec 2 arguments comme "move", vous devez ajouter "@" uniquement au (premier) paramètre de gauche. 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 voir, nous n'avons pas besoin d'ajouter "@" à "README2 @ txt"

Srdjan
la source
0

@David H

Je viens d'essayer une commande similaire sans échapper aux symboles @ et cela fonctionne toujours bien

svn ci splash.png [email protected]@

Ceci est sur GNU bash, version 3.2.48 (1) -release (x86_64-apple-darwin10.0) et svn 1.6.16

Qazzian
la source
0

La seule solution qui a fonctionné pour moi était la même que celle suggérée par @NPike

svn retourne 'chemin / vers / nom de fichier @ ext @'

Jonyx4
la source
Êtes-vous sûr que cela devrait être une nouvelle réponse à la question initiale? Cela devrait plutôt être un vote positif ou un commentaire
Nico Haase
désolé, mon mauvais, je ne peux pas encore ajouter de commentaire
Jonyx4
0

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, utilisation des printfoptions findet extension du shell

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