34 votes

Pourquoi Subversion ignore les fichiers qui contiennent le symbole @ ?

Lorsque j'essaie d'exécuter une commande comme celle-ci (depuis une ligne de commande ou un script Perl - peu importe) :

svn revert "build\myfile@test.meta"

SVN saute ce fichier et sort :

Skipped 'build\myfile'

J'ai essayé de le faire :

svn revert "build\*.meta"

Mais cela donne le même résultat.

Je peux inverser ces fichiers depuis l'interface graphique. Et je peux rétablir ces fichiers en le faisant (mais cela rétablit plus de choses que je ne le souhaite) :

svn revert --recursive "build"

Existe-t-il une solution de contournement pour cela ?

80voto

Avi Points 14468

Le signe @ dans les noms de fichiers dans Subversion a en fait une signification spéciale - un numéro de révision fixe. Pour citer le Livre sur la subversion :

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

Ainsi, vous devriez ajouter un signe @ aux noms de fichiers dans scripts, comme ceci :

svn revert "build\myfile@test.meta@"

22voto

bhavinb Points 2441

Pour compléter la réponse correcte ci-dessus, si vous avez beaucoup de fichiers avec le symbole "@" dans leur nom que vous voulez traiter en lot (c'est-à-dire utiliser le caractère générique *), vous pouvez faire quelque chose comme ceci dans le Terminal OS X (ou n'importe quelle machine Linux) :

find . -name "*@*" | xargs -I % svn add %@

La commande ci-dessus utilisera l'utilitaire find pour lister chaque fichier avec @ dans son nom de fichier, puis transmettra le chemin d'accès au fichier au SVN en utilisant XARGS. XARGS remplacera chaque occurrence de % par le chemin d'accès et ajoutera le "@" spécial à la fin du nom de fichier afin que SVN l'accepte.

J'espère que cela vous aidera. J'ai dû me creuser la tête un peu pour ajouter les fichiers @2x.png nécessaires à la mise à jour de mon application pour iOS4.0.

2voto

Je viens de le tester correctement sous Windows à l'aide de l'interpréteur de commandes cmd.exe - le fait de mettre le nom entre guillemets fonctionne :

ctmkx> svn revert "trunk\foo@bar.txt"
Reverted 'trunk\foo@bar.txt'

0voto

hometoast Points 6536

Quel système d'exploitation ? S'il s'agit d'un système *nix, essayez de citer votre fichier avec 'single@quotes'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X