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.

Geschichtsforschung

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:

svn diff

Zeigt die Details einer bestimmten Änderung auf Zeilenebene

svn log

Zeigt Ihnen grobe Informationen: Mit Revisionen verknüpfte Protokolleinträge zu Datum und Autor und welche Pfade sich in jeder Revision geändert haben.

svn cat

Holt eine Datei hervor, wie sie mit einer bestimmten Revisionsnummer einmal ausgesehen hat und zeigt sie auf dem Bildschirm an

svn annotate

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.

svn list

Zeigt die Dateien in einem Verzeichnis für eine gewünschte Revision an

Detaillierte Untersuchung der Änderungsgeschichte

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

Untersuchen lokaler Änderungen

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
$

Vergleichen der Arbeitskopie mit dem Projektarchiv

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
$

Vergleichen von Projektarchiv-Revisionen

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

Erzeugung einer Liste der Änderungsgeschichte

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.

Stöbern im Projektarchiv

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.

Anzeige von Dateiinhalten

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
$

Anzeigen der zeilenweisen Zuordnung von Änderungen

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] 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 svn blame … oder svn praise … statt der kanonischen Kommandoform svn annotate eintippen. Das geht in Ordnung – die Entwickler von Subversion haben so etwas erwartet, so dass diese besonderen Befehls-Aliase auch funktionieren.

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.

Auflistung versionierter Verzeichnisse

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] Warnung

Der Befehl svn list ohne Argumente verwendet standardmäßig den Projektarchiv-URL des aktuellen Arbeitsverzeichnisses und nicht das Verzeichnis der lokalen Arbeitskopie. Schließlich können Sie, falls Sie eine Auflistung des lokalen Verzeichnisses möchten, das einfache ls (oder irgendein vernünftiges nicht-unixartiges Äquivalent) benutzen.

Bereitstellung älterer Projektarchiv-Schnappschüsse

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] 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
…
$


[8] Sehen Sie? Wir haben Ihnen gesagt, dass Subversion eine Zeitmaschine sei.