Diese Dokumentation wurde zur Beschreibung der Serie 1.7.x von Apache™ Subversion® erstellt. Falls Sie eine unterschiedliche Version von Subversion einsetzen, sei Ihnen dringend angeraten, bei http://www.svnbook.com/ vorbeizuschauen und stattdessen die zu Ihrer Version von Subversion passende Version dieser Dokumentation heranzzuiehen.
Ihr Subversion-Projektarchiv ist wie eine Zeitmaschine. Es legt einen Eintrag für jede jemals übergebene Änderung an und erlaubt Ihnen, diese Geschichte durch die Untersuchung sowohl ehemaliger Datei- und Verzeichnisversionen als auch der begleitenden Metadaten zu erforschen. Mit einem einzigen Subversion-Befehl können Sie das Projektarchiv genauso auschecken (oder eine bestehende Arbeitskopie wiederherstellen), wie es zu einem beliebigen Zeitpunkt oder einer Revisionsnummer in der Vergangenheit war. Allerdings möchten Sie manchmal nur in die Vergangenheit spähen anstatt dorthin zu gehen.
Es gibt mehrere Befehle, die Sie mit historischen Daten aus dem Projektarchiv versorgen können:
Zeigt die Details einer bestimmten Änderung auf Zeilenebene
Zeigt Ihnen grobe Informationen: Mit Revisionen verknüpfte Protokolleinträge zu Datum und Autor und welche Pfade sich in jeder Revision geändert haben.
Holt eine Datei hervor, wie sie mit einer bestimmten Revisionsnummer einmal ausgesehen hat und zeigt sie auf dem Bildschirm an
Holt eine Datei hervor, wie sie mit einer bestimmten Revisionsnummer einmal ausgesehen hat und zeigt den Inhalt in Tabellenform mit Informationen, wann jede Zeile das letzte Mal geändert wurde.
Zeigt die Dateien in einem Verzeichnis für eine gewünschte Revision an
svn diff ist uns bereits begegnet – es zeigt Dateiunterschiede im unified-diff-Format; wir verwendeten es, um die lokalen Änderungen an unserer Arbeitskopie anzuzeigen, bevor wir sie dem Projektarchiv übergaben.
Tatsächlich stellt sich heraus, dass es drei verschiedene Verwendungsmöglichkeiten für svn diff gibt:
zum Untersuchen lokaler Änderungen
zum Vergleichen Ihrer Arbeitskopie mit dem Projektarchiv
zum Vergleichen von Projektarchiv-Revisionen
Wie wir gesehen haben, vergleicht der Aufruf von
svn diff
ohne Optionen die
Arbeitsdateien mit den zwischengespeicherten
„ursprünglichen“ Kopien im
.svn
-Bereich:
$ svn diff Index: rules.txt =================================================================== --- rules.txt (revision 3) +++ rules.txt (working copy) @@ -1,4 +1,5 @@ Be kind to others Freedom = Responsibility Everything in moderation -Chew with your mouth open +Chew with your mouth closed +Listen when others are speaking $
Wird eine einzelne Nummer mit --revision
(-r
) übergeben, wird die Arbeitskopie mit
der angegebenen Revision im Projektarchiv verglichen:
$ svn diff -r 3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revision 3) +++ rules.txt (working copy) @@ -1,4 +1,5 @@ Be kind to others Freedom = Responsibility Everything in moderation -Chew with your mouth open +Chew with your mouth closed +Listen when others are speaking $
Werden zwei Revisionsnummern durch einen Doppelpunkt
getrennt mit --revision
(-r
) übergeben, werden die beiden
Revisionen direkt miteinander verglichen:
$ svn diff -r 2:3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revision 2) +++ rules.txt (revision 3) @@ -1,4 +1,4 @@ Be kind to others -Freedom = Chocolate Ice Cream +Freedom = Responsibility Everything in moderation Chew with your mouth open $
Eine bequemere Möglichkeit, eine Revision mit der
Vorgänger-Revision zu vergleichen, bietet die Verwendung der
Option --change
(-c
):
$ svn diff -c 3 rules.txt Index: rules.txt =================================================================== --- rules.txt (revision 2) +++ rules.txt (revision 3) @@ -1,4 +1,4 @@ Be kind to others -Freedom = Chocolate Ice Cream +Freedom = Responsibility Everything in moderation Chew with your mouth open $
Zu guter Letzt können Sie Revisionen im Projektarchiv auch dann vergleichen, falls Sie gar keine Arbeitskopie auf Ihrem lokalen Rechner haben, indem Sie einfach den entsprechenden URL auf der Kommandozeile angeben:
$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt … $
Um Informationen über den Werdegang einer Datei oder eines Verzeichnisses zu bekommen, benutzen Sie den Befehl svn log. svn log versorgt Sie mit einem Eintrag, der Auskunft darüber gibt, wer Änderungen an einer Datei oder einem Verzeichnis gemacht hat, in welcher Revision die Änderung stattfand, zu welcher Zeit und welchem Datum die Revision entstand sowie – falls verfügbar – dem die Übergabe begleitenden Protokolleintrag:
$ svn log ------------------------------------------------------------------------ r3 | sally | 2008-05-15 23:09:28 -0500 (Do, 15. Mai 2008) | 1 Zeile include-Zeilen hinzugefügt und Anzahl der Käsescheiben korrigiert. ------------------------------------------------------------------------ r2 | harry | 2008-05-14 18:43:15 -0500 (Mi, 14. Mai 2008) | 1 Zeile main()-Methoden hinzugefügt. ------------------------------------------------------------------------ r1 | sally | 2008-05-10 19:50:31 -0500 (Sa, 10. Mai 2008) | 1 Zeile Erstimport ------------------------------------------------------------------------
Beachten Sie, dass die Protokolleinträge standardmäßig in
umgekehrter zeitlicher Reihenfolge
ausgegeben werden. Falls Sie eine andere Folge von Revisionen
in einer bestimmten Anordnung oder nur eine einzige Revision
sehen möchten, übergeben Sie die Option
--revision
(-r
):
Tabelle 2.1. Häufige Protokollanfragen
Befehl | Beschreibung |
---|---|
svn log -r 5:19
|
Anzeige der Protokolleinträge für die Revisionen 5 bis 19 in chronologischer Reihenfolge |
svn log -r 19:5
|
Anzeige der Protokolleinträge für die Revisionen 5 bis 19 in umgekehrt chronologischer Reihenfolge |
svn log -r 8
|
Anzeige des Protokolleintrags nur für Revision 8 |
Sie können sich auch die Protokollgeschichte einer einzigen Datei oder eines einzigen Verzeichnisses ansehen. Zum Beispiel:
$ svn log foo.c … $ svn log http://foo.com/svn/trunk/code/foo.c …
Diese Befehle zeigen nur Protokolleinträge für die Revisionen, in der sich die Arbeitsdatei (oder URL) geändert hat.
Wenn Sie noch mehr Informationen über eine Datei oder ein
Verzeichnis benötigen, können Sie svn log
auch die Option --verbose
(-v
) mitgeben. Weil Ihnen Subversion erlaubt,
Dateien und Verzeichnisse zu kopieren und zu verschieben, ist
es wichtig, Pfadänderungen im Dateisystem
mitzuverfolgen. Daher beinhaltet bei dieser Option die Ausgabe
von svn log eine Liste veränderter Pfade in
einer Revision:
$ svn log -r 8 -v ------------------------------------------------------------------------ r8 | sally | 2008-05-21 13:19:25 -0500 (Mi, 21. Mai 2008) | 1 Zeile Geänderte Pfade: M /trunk/code/foo.c M /trunk/code/bar.h A /trunk/code/doc/README Die Unterraumwinde gefrozzelt. ------------------------------------------------------------------------
svn log akzeptiert ebenfalls die
Option --quiet
(-q
), die den
Protokolleintrag unterdrückt. Zusammen mit der Option
--verbose
(-v
) zeigt es nur
die Namen der geänderten Dateien an.
Seit Subversion 1.7 können Anwender der Subversion
Kommandozeile den besonderen Ausgabemodus für
svn log verwenden, der eine Anzeige der
Unterschiede integriert, wie sie der Befehl svn
diff erzeugt, der oben eingeführt wurde. Wenn Sie
svn log mit der Option --diff
aufrufen, hängt Subversion an jedes Revisionsprotokoll einen
Bericht über die Unterschiede im diff-Stil.
Das ist sehr praktisch, um sowohl die groben semantischen als
auch die zeilenweisen Änderungen einer Revision gleichzeitig
zu sehen.
Wenn Sie svn cat und svn list verwenden, können Sie sich verschiedene Revisionen von Dateien und Verzeichnissen ansehen, ohne die Revision Ihrer Arbeitskopie ändern zu müssen. Tatsächlich brauchen Sie dafür nicht einmal eine Arbeitskopie.
Falls Sie eine frühere Version einer Datei untersuchen möchten und nicht notwendigerweise die Unterschiede zwischen zwei Dateien, können Sie svn cat verwenden:
$ svn cat -r 2 rules.txt Be kind to others Freedom = Chocolate Ice Cream Everything in moderation Chew with your mouth open $
Sie können die Ausgabe auch direkt in eine Datei umleiten:
$ svn cat -r 2 rules.txt > rules.txt.v2 $
Sehr ähnlich wie der im vorangegangenen Abschnitt besprochene Befehl svn cat ist der Befehl svn annotate. Auch dieser Befehl zeigt den Inhalt einer versionierten Datei an, jedoch macht er das tabellarisch. Jede ausgegebene Zeile zeigt nicht nur eine Zeile des Dateiinhalts, sondern auch den Namen des Erstellers, der Revisionsnummer und (optional) des Zeitstempels der Revision, in der die Zeile zuletzt geändert wurde.
Wenn es auf eine Datei der Arbeitskopie angewendet wird, zeigt svn annotate standardmäßig eine zeilenweise Zuordnung der Datei, so wie sie gerade in der Arbeitskopie vorliegt.
$ svn annotate rules.txt 1 harry Be kind to others 3 sally Freedom = Responsibility 1 harry Everything in moderation - - Chew with your mouth closed - - Listen when others are speaking
Beachten Sie, dass für einige Zeilen keine Zuordnung
angegeben wird. In diesem Fall liegt es daran, dass diese
Zeilen in der Arbeitskopie der Datei geändert wurden. Auf
diese Weise wird svn annotate eine
Alternative für Sie, um zu sehen, welche Zeilen in einer
Datei Sie geändert haben. Sie können das
Revisions-Schlüsselwort BASE
verwenden
(siehe „Revisions-Schlüsselworte“), um
stattdessen die unveränderte Form der Datei in Ihrer
Arbeitskopie zu betrachten.
$ svn annotate rules.txt@BASE 1 harry Be kind to others 3 sally Freedom = Responsibility 1 harry Everything in moderation 1 harry Chew with your mouth open
Die Option --verbose (-v)
veranlasst
svn annotate, auf jeder Zeile zusätzlich
den zur angezeigten Revisionsnummer gehörigen Zeitstempel
auszugeben. (Das erhöht erheblich die Breite jeder
Ausgabezeile, so dass wir an dieser Stelle auf eine
Demonstration verzichten.)
Wie bei svn cat können Sie auch svn annotate auffordern, ältere Revisionen der Datei anzuzeigen. Das kann ein nützlicher Trick sein, wenn Sie wissen möchten, wer eine bestimmte Zeile vor der letzten Änderung geändert hat.
$ svn blame rules.txt -r 2 1 harry Be kind to others 1 harry Freedom = Chocolate Ice Cream 1 harry Everything in moderation 1 harry Chew with your mouth open
Anders als beim Befehl svn cat ist
die Funktionalität von svn annotate stark
an das Konzept von „Zeilen“ mit Text in einer
menschenlesbaren Datei gebunden. Somit führt der Versuch,
diesen Befehl auf eine Datei anzuwenden, die Subversion als
nicht menschenlesbar (über die
Dateieigenschaft svn:mime-type
–
siehe „Datei-Inhalts-Typ“ für Details) erachtet, bekommen Sie eine
Fehlermeldung.
$ svn annotate images/logo.png Überspringe Binärdatei: »images/logo.png« $
Wie die Fehlermeldung verrät, können Sie die Option
--force
verwenden, um diese Überprüfung zu
unterbinden und mit der Zuordnung weitermachen, als handele
es sich tatsächlich um menschenlesbaren, zeilenbasierten
Dateiinhalt. Natürlich bekommen Sie, was Sie haben wollen,
wenn Sie Subversion dazu zwingen, eine zeilenbasierte
Zuordnung auf eine Nicht-Text-Datei anzuwenden: einen
Bildschirm voller Müll.
$ svn annotate images/logo.png --force 6 harry \211PNG 6 harry ^Z 6 harry 7 harry \274\361\MI\300\365\353^X\300…
Tipp | |
---|---|
Abhängig von Ihrer Stimmung zum Zeitpunkt der
Ausführung dieses Befehls sowie Ihren Gründen dafür,
könnte es sein, dass Sie |
Schließlich können Sie, wie bei vielen der informationellen Subversion-Befehle, auch in Aufrufen des Befehls svn annotate Dateien über deren Projektarchiv-URLs referenzieren, was Ihnen erlaubt, diese Informationen auch ohne Zugang zu einer Arbeitskopie zu erlangen.
Der Befehl svn list zeigt Ihnen, welche Dateien sich in einem Projektarchiv-Verzeichnis befinden, ohne die Dateien auf Ihren lokalen Rechner herunterladen zu müssen:
$ svn list http://svn.example.com/repo/project README branches/ tags/ trunk/
Falls Sie eine detailliertere Auflistung wünschen,
übergeben Sie die Option --verbose
(-v
), um eine Ausgabe ähnlich der folgenden
zu bekommen:
$ svn list -v http://svn.example.com/repo/project 23351 sally Feb 05 13:26 ./ 20620 harry 1084 Jul 13 2006 README 23339 harry Feb 04 01:40 branches/ 23198 harry Jan 23 17:17 tags/ 23351 sally Feb 05 13:26 trunk/
Die Spalten zeigen Ihnen die Revision, in der die Datei zuletzt geändert wurde, den Benutzer, der sie änderte, die Größe, falls es sich um eine Datei handelt, sowie den Namen des Objektes.
Warnung | |
---|---|
Der Befehl |
Zusätzlich zu den obigen Befehlen können Sie die Option
--revision
(-r
) mit
svn update verwenden, um eine vollständige
Arbeitskopie „zeitlich zurückzusetzen“:[8]
# Lass das aktuelle Verzeichnis aussehen wie in r1729. $ svn update -r 1729 Updating '.': … $
Tipp | |
---|---|
Viele Subversion-Neulinge versuchen das vorangehende svn update-Beispiel zu verwenden, um übergebene Änderungen „rückgängig“ zu machen, was allerdings nicht funktioniert, da Sie keine Änderungen übergeben können, die Sie durch das zeitliche Zurücksetzen einer Arbeitskopie erhalten haben, falls die geänderten Dateien neuere Revisionen haben. Siehe „Zurückholen gelöschter Objekte“ für eine Beschreibung, wie eine Übergabe „rückgängig“ gemacht wird. |
Sollten Sie es bevorzugen, eine vollständige neue
Arbeitskopie aus einem älteren Schnappschuss zu erzeugen,
können Sie das, indem Sie den üblichen Befehl svn
checkout modifizieren. Wie bei svn
update, können Sie die Option
--revision
(-r
) mitgeben.
Aus Gründen, die wir in „Peg- und operative Revisionen“ erörtern werden, sollten Sie stattdessen die Zielrevision
als Teil der erweiterten URL-Syntax von Subversion
angeben.
# Den Trunk von r1729 auschecken. $ svn checkout http://svn.example.com/svn/repo/trunk@1729 trunk-1729 … # Den aktuellen Trunk auschecken, wie er in r1729 aussah. $ svn checkout http://svn.example.com/svn/repo/trunk -r 1729 trunk-1729 … $
Wenn Sie am Ende ein Release bauen und die versionierten
Dateien und Verzeichnisse zu einem Bündel schnüren möchten, können
Sie svn export verwenden, um eine lokale
Kopie des gesamten oder teilweisen Projektarchivs ohne
irgendwelche
.svn
-Verzeichnisse zu erhalten. Die
Syntax ist grundsätzlich identisch zu der von svn
checkout:
# Den Trunk aus der letzten Revision exportieren. $ svn export http://svn.example.com/svn/repo/trunk trunk-export … # Den Trunk aus r1729 exportieren. $ svn export http://svn.example.com/svn/repo/trunk@1729 trunk-1729 … # Den aktuellen Trunk exportieren, wie er in in r1729 aussah. $ svn export http://svn.example.com/svn/repo/trunk -r 1729 trunk-1729 … $