Diese Dokumentation wurde zur Beschreibung der Serie 1.6.x von 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
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 (Thu, 15 May 2008) | 1 line include-Zeilen hinzugefügt und Anzahl der Käsescheiben korrigiert. ------------------------------------------------------------------------ r2 | harry | 2008-05-14 18:43:15 -0500 (Wed, 14 May 2008) | 1 line main()-Methoden hinzugefügt. ------------------------------------------------------------------------ r1 | sally | 2008-05-10 19:50:31 -0500 (Sat, 10 May 2008) | 1 line 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 (Wed, 21 May 2008) | 1 line 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
zeigt es nur die Namen der
geänderten Dateien an.
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 $
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 … $
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 Dateien aus
Subversion zu einem Bündel schnüren möchten, ohne allerdings
diese verdammten .svn
-Verzeichnisse dabei
zu haben, können Sie svn export verwenden,
um eine lokale Kopie des gesamten oder teilweisen Projektarchivs
ohne .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 … $