2009-12-31 4 views
34

, wenn ich versuche Befehl wie folgt auszuführen (von einer Befehlszeile oder Perl-Skript - es spielt keine Rolle):Warum überspringt Subversion Dateien, die das @ -Symbol enthalten?

svn revert "build\[email protected]" 

SVN überspringt diese Datei und Ausgänge:

Skipped 'build\myfile' 

Ich habe versucht, dabei:

svn revert "build\*.meta" 

Aber es gibt das gleiche Ergebnis.

Ich kann diese Dateien von der GUI wiederherstellen. Und ich kann diese Dateien wiederherstellen, indem Sie (aber es kehrt mehr als ich will):

svn revert --recursive "build" 

Gibt es eine Abhilfe für dieses?

Antwort

80

Das @ -Zeichen in Dateinamen in Subversion tatsächlich eine besondere Bedeutung hat - eine verdübelt Revisionsnummer. Um es mit den Subversion book:

Der perceptive Leser wahrscheinlich an dieser Stelle fragen, ob die Peg-Revision Syntax verursacht Probleme für Arbeitskopiepfade oder URLs, die tatsächlich an den Zeichen in ihnen haben. Wie kann svn schließlich wissen, ob news @ 11 der Name eines Verzeichnisses in meinem Baum oder nur eine Syntax für "revision 11 of news" ist? Zum Glück, während svn immer Letzteres annehmen wird, gibt es eine triviale Problemumgehung. Sie müssen nur ein at-Zeichen an das Ende des Pfades anhängen, z. B. news @ 11 @. svn kümmert sich nur um das letzte at-Zeichen im Argument, und es wird nicht als illegal angesehen, einen Literalrevisionsspezifikator nach dem at-Zeichen wegzulassen. Diese Problemumgehung gilt sogar für Pfade, die mit einem at-Zeichen enden. Sie würden den Dateinamen @@ verwenden, um über eine Datei namens filename @ zu sprechen.

Also, sollten Sie ein @ -Zeichen auf Dateinamen in Skripten, wie folgt anhängen:

svn revert "build\[email protected]@" 
+0

Verwenden Sie das unten stehende Skript von bhavinb für jede Datei in einem Verzeichnis. Tolles Skript und großartige Antwort Avi. –

+0

Danke! Ich wurde verrückt. – Evert

+0

+1 Vielen Dank, ich war auch verrückt^_^ – Niko

0

Welches Betriebssystem? Wenn es sich um ein * nix System handelt, zitieren Sie Ihre Datei mit 'single @ quotes'.

+0

Es Fenster aufgerüstet werden. Einfache Anführungszeichen funktionieren nicht - Sie erhalten die Ausgabe wie folgt: Übersprungene '' build '' (d. H. Doppelte einfache Anführungszeichen) –

+1

@Paulius: Zu wissen, welches OS es in Ihrer ursprünglichen Frage war, wäre nützlich gewesen. –

+0

auch funktioniert der einfache Zitate Trick sowieso nicht für diese auf nix – Purrell

2

getestet es einfach richtig an den Fenstern der cmd.exe-Shell - den Namen in doppelte Anführungszeichen gesetzt funktioniert:

ctmkx> svn revert "trunk\[email protected]" 
Reverted 'trunk\[email protected]' 
22

einfach auf die oben richtige Antwort hinzuzufügen, wenn Sie viele Dateien mit dem Symbol „@“ haben in ihrem Namen mögen, die Sie in einer Charge (dh Verwendung Platzhalter *) verarbeiten, können Sie so etwas wie dies in O X Terminal (oder eine Linux-Box wirklich) tun können:

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

Der obige Befehl wird verwenden, um den Fund Dienstprogramm, um jede Datei mit @ in seinem aufzulisten Dateiname und leiten Sie dann den Pfad zur Datei an SVN mit XARGS. XARGS ersetzt jedes Vorkommen von% durch den Pfad und fügt das spezielle "@" am Ende des Dateinamens an, so dass SVN es akzeptiert.

hoffte, das hilft - ich hatte meinen Kopf ein wenig whack die gazzilion hinzufügen @ 2x.png Dateien, die benötigt wurden, für meine App für iOS4.0

+0

Das hat beim ersten Mal perfekt funktioniert. Danke herzlich! –

+0

Das war ein Lebensretter. Ich habe es tatsächlich mit svn stat | kombiniert grep "^?" | awk '{print $ 2}' | xargs svn hinzufügen, um svn stat | grep "^?" | awk '{print $ 2}' | xargs -I% svn add% @ – Das

Verwandte Themen