Wie entkomme ich @ Zeichen in von Subversion verwalteten Dateinamen?

191

Bei vielen Subversion-Vorgängen können Sie durch Anhängen des Symbols '@' an das Ende einer Datei oder eines URL-Arguments eine bestimmte Revision dieser Datei als Ziel festlegen. Beispielsweise gibt "svn info test.txt@1234" Informationen zu test.txt an, wie sie in Revision 1234 vorhanden waren.

Wenn der Name der Datei jedoch ein @ enthält, wird er von Subversion fälschlicherweise als Revisionsspezifizierer interpretiert:

svn info 'test @ .txt' svn: Syntaxfehler beim Parsen der Revision '.txt'

Ich habe versucht, doppelte und einfache Anführungszeichen zu setzen und mit '/', '\' und '@' zu entkommen. Wie kann ich Subversion anweisen, die @ -Symbole als Teil des Dateinamens zu behandeln?

Weston
quelle
3
Warum um alles in der Welt haben Sie Dateinamen mit @ in ihnen? Fragen Sie nach Ärger, wenn Sie mich fragen ... :-)
JesperE
Sehr gute Frage! :) Ich übernehme ein Projekt, in dem dieses Zeichen ein grundlegender Bestandteil der Dateinamenskonventionen ist und das in naher Zukunft leider nicht geändert werden kann.
Weston
57
Apple hat diese Konvention für alle iOS-Entwickler ab iOS 4+ erstellt. Alle Assets sollten @ 2x heißen, wenn sie für eine
Dimitris
2
Standard für Ghetto alten Stil Matlab OO
Chinasaur
Wenn Sie Ihren privaten Schlüssel oder Sperrschlüssel aus Thunderbirds Enigmail speichern, wird ein Dateiname erstellt - angesichts der Anwendung nicht unangemessen -, der ein at-Zeichen enthält
Peter Flynn

Antworten:

283

Aus dem SVN-Buch (Hervorhebung hinzugefügt):

Der aufmerksame Leser fragt sich an dieser Stelle wahrscheinlich, ob die Peg-Revisionssyntax Probleme bei der Arbeit mit Kopierpfaden oder URLs verursacht, die tatsächlich Zeichen enthalten. Immerhin tut , wie svn Know ob news@11der Name eines Verzeichnisses in meinem Baum ist oder nur eine Syntax für „Revision 11 von Nachrichten “? Zum Glück gibt es, obwohl svn immer Letzteres annimmt , eine triviale Problemumgehung. Sie müssen nur ein at-Zeichen an das Ende des Pfads anhängen , z news@11@. svn kümmert sich nur um das letzte at-Zeichen im Argument, und es wird nicht als illegal angesehen, nach diesem at-Zeichen einen wörtlichen Peg-Revisionsspezifizierer wegzulassen. Diese Problemumgehung gilt sogar für Pfade, die mit einem at-Zeichen enden - das Sie verwenden würdenfilename@@um über eine Datei mit dem Namen Dateiname @ zu sprechen .

Rob Kennedy
quelle
4
Beachten Sie, dass Sie für die Verwendung von "svn diff" einen Revisionsparameter hinzufügen müssen. "svn up @ file @" funktioniert, aber "svn diff @ file @" funktioniert nicht. Sie müssen "svn diff -r HEAD @ file @"
analytik
Hinweis für das SVN-Buch: Dateien können auch unter Windows ohne Erweiterungen vorhanden sein, es kann sich also news@11auch um eine Datei handeln.
Tryse
1
Beachten Sie, dass ein Argument für einige Befehle wie das Umbenennen entweder ein versioniertes Element oder ein lokaler Dateiname sein kann. Beim Umbenennen wird das Ziel auch nach einer angehefteten Revision durchsucht, die anschließend möglicherweise als einfacher Name behandelt wird. Zum Beispiel, wenn Sie umbenennen möchten , @fooauf @bar, svn rename @foo@ @barwird zu bemängeln @bar; aber wenn Sie es schaffen svn rename @foo@ @bar@, wird der neue Name buchstäblich sein @bar@. Um dies zu vermeiden, fügen Sie ./(oder .\ unter Windows) hinzu, um zu verdeutlichen, dass es sich um einen lokalen Pfad handelt : svn rename @foo@ ./@bar.
Zastai
82

Die ursprüngliche Antwort ist richtig, aber vielleicht nicht explizit genug. Die speziellen Unix-Befehlszeilenoptionen lauten wie folgt:

svn info '[email protected]@'

oder

svn info "[email protected]@"

oder

svn info image\@2x.png\@

Ich habe gerade alle drei getestet.

David H.
quelle
4
Ich habe auch getestet svn info [email protected]@und es hat auch funktioniert. Ja, keine Anführungszeichen oder Schrägstriche!
Nate
Die Notwendigkeit des Zitierens hängt von Ihrer Shell ab - ich verwende KSH und sicher benötigen Sie die Anführungszeichen (da '@' ein Zeichen dafür ist, dass ein Prozess im Hintergrund ausgeführt werden soll). YMMV je nach Shell.
David H
Ja. Mein Kilometerstand war auf der bashAutobahn :)
Nate
1
@Nate Jetzt kann ich es nicht zum Scheitern bringen - es funktioniert gut ohne die Anführungszeichen in ksh. Ich weiß nicht, warum ich dachte, ich brauche sie - vielleicht ein anderes Problem - es war vor 2 Jahren, als ich dies gepostet habe ...
David H
14

Lösung zum Hinzufügen mehrerer Dateien in verschiedenen Unterordnern:

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

Ersetzen Sie einfach das "png" in " @ .png" durch die Art von Dateien, die Sie hinzufügen möchten.

Lcsky
quelle
Stellen Sie sicher, dass Sie Ihre Dateinamen zitieren oder maskieren (und die Groß- und Kleinschreibung nicht berücksichtigen). Außerdem müssen Dateien @in ihrem Namen nicht als Sonderfall behandelt werden. Sie können das @Symbol sicher an alle Dateinamen anhängen : for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. Lässt Ihr Ansatz Ihr SVN-Repo nicht mit einer Datei- / Verzeichnisstruktur zurück, die nicht mit der funktionierenden lokalen Kopie übereinstimmt?
Neu
Die Verwendung execvon find könnte eifriger sein:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung
11

Um die folgende Datei hinzuzufügen: [email protected] Gehen Sie wie folgt vor: svn add image \ @ 2x.png @

Malek Belkahla
quelle
8

In meinem Fall musste ich Dateien aus einem SVN-Repo entfernen, das ein @ -Zeichen enthielt:

Das würde nicht funktionieren:

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

Aber das tat:

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

Um mehrere Dateien hinzuzufügen, gibt es eine alternative Lösung:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
liruqi
quelle
Bitte erläutern Sie Ihre Antwort.
Hemang
3
Sie können awk anstelle von grep verwenden:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi
1

Für svn-Befehle mit 2 Argumenten wie "move" müssen Sie "@" nur am linken (ersten) Parameter anhängen . Beispielsweise:

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

Diese Zeile ist wichtig: $ svn move README @ txt @ README2 @ txt

Wie Sie sehen, müssen wir bei "README2 @ txt" kein "@" anhängen.

Srdjan
quelle
0

@ David H.

Ich habe gerade einen ähnlichen Befehl ausprobiert, ohne die @ -Symbole zu umgehen, und er funktioniert immer noch einwandfrei

svn ci splash.png [email protected]@

Dies ist auf GNU Bash, Version 3.2.48 (1) -Veröffentlichung (x86_64-apple-darwin10.0) und SVN 1.6.16

Qazzian
quelle
0

Die einzige Lösung, die für mich funktioniert hat, war die gleiche, die @NPike vorgeschlagen hat

svn revert 'path / to / filename @ ext @'

Jonyx4
quelle
Sind Sie sicher, dass dies eine neue Antwort auf die ursprüngliche Frage sein sollte? Dies sollte eher eine Gegenstimme oder ein Kommentar sein
Nico Haase
Entschuldigung, mein schlechtes, ich kann noch keinen Kommentar hinzufügen
Jonyx4
0

Ich hatte heute das Problem mit Dateinamen, die aus E-Mail-Adressen generiert wurden (keine sehr gute Idee!).

Lösung mit printfOptionen findund Shell-Erweiterung

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