Subversion FAQ

von Stefan Wichmann

Einleitung:

Diese Seite ist eine Einführung in die generelle Arbeitsweise des Versionsverwaltungssystems Subversion. Darin werden typische Fragen, auf die man bei der täglichen Arbeit mit Subversion stößt, beantwortet. In allen Beispielen wird als Client das Kommandozeilentool svn verwendet.

  1. Wie sieht die grundsätzliche Arbeitsweise mit Subversion aus?
  2. Wie kann ich eine lokale Kopie anlegen bzw. aktualisieren?
  3. Wie kann ich meine Änderungen für andere zugänglich machen?
  4. Was mache ich bei einem Konflikt?
  5. Wie bekomme ich heraus, was sich in einzelnen Versionen verändert hat?
  6. Wie kann ich mir den Inhalt von Dateien im Repository anzeigen lassen ohne meine Kopie zu verändern?
  7. Wie kann ich Dateien/Verzeichnisse hinzufügen, umbenennen, löschen, kopieren oder verschieben?
  8. Wie kann ich Dateien/Verzeichnisse für andere sperren bzw. wieder freigeben?
  9. Wo bekomme ich weitere Hilfestellungen?



1) Wie sieht die grundsätzliche Arbeitsweise mit Subversion aus?

Subversion ist ein Dateiserver, auf dem allen Daten (im sogenannten Repository) gespeichert werden. Möchte man mit diesen Daten arbeiten, so muß man sich zunächst ein lokale Kopie (working copy) dieser Dateien/Verzeichnisse anlegen. Diesen Vorgang nennt man checkout. Hat man sich eine solche Kopie bereits angelegt, kann man diese mittels update auf den neusten Stand bringen.

Nun kann man damit beginnen die Dateien zu bearbeiten. Möchte man neue Dateien/Verzeichnisse anlegen oder bestehende löschen, umbenennen, verschieben oder kopieren, so muß man hierfür auf die Unterstützung von einem Subversionclient zurückgreifen (siehe Frage 7). Den Inhalt von bereits bestehenden Dateien kann man einfach so bearbeiten.
Möchte man eine Binärdatei bearbeiten, so sollte man diese vorher sperren und nachher wieder freigeben (siehe Frage 8).

Hat man seine Arbeiten abgeschlossen, sollte man einen Blick auf die Veränderungen werfen, die man vorgenommen hat (siehe Frage 5 und Frage 6). Haben andere Clients in der Zwischenzeit ebenfalls an den gleichen Dateien gearbeitet, müssen die Veränderungen außerdem zusammengeführt werden (Dieser Vorgang wird merge genannt, siehe Frage 4). Schließlich kann man die aktualisierten Daten zurück in das Repository spielen (siehe Frage 3).


2) Wie kann ich eine lokale Kopie anlegen bzw. aktualisieren?

Um eine lokale Kopie eines Dateibaums aus dem Repository anzulegen, benutzt man in Subversion den checkout-Befehl. Um eine bestehende working copy auf den aktuellen Stand (oder den Stand einer beliebigen Revision) zu bringen nutzt man den update-Befehl.

Syntax (checkout):
svn checkout  URL[@REV]... [PFAD]

Beschreibung (checkout):
URL beschreibt das Quellrepository. @REV ist optional und gibt die gewünschte Revision an. Wird der Parameter weggelassen, wird die letzte Version genommen. PFAD ist ebenfalls optional und bei Weglassen wird das aktuelle Arbeitsverzeichnis genommen.


Syntax (update):
svn update [PFAD...]

Beschreibung (update):
PFAD beschreibt den Pfad der zu aktualisierenden Daten. Wird keiner angegeben, so wird das aktuelle Arbeitsverzeichnis auf den letzten Stand gebracht. Mit dem optionalen Parameter --revision[REVISION] kann man die lokale Kopie auf den Stand REVISION bringen.

3) Wie kann ich meine Änderungen für andere zugänglich machen?

Um die lokalen Änderungen zurück in das Repository zu schreiben, dient der Befehl commit. Falls sich die gleichen Daten, die man schreiben will, seit dem letzten update verändert haben, schlägt des commiten fehl und die betroffenen Dateien bleiben in einem Konfliktzustand, bis man diesen selber aufhebt (siehe Frage 4).

Syntax:
svn commit [PFAD...]

Beschreibung:
PFAD beschreibt den Pfad der zu schreibenden Daten. Optional kann mittels -m KOMMENTAR eine Nachricht über die gemachten Veränderungen angehängt werden. Die Verwendung dieser Funktion wird dringend empfohlen.

4) Was mache ich bei einem Konflikt?

Zu einem Konflikt kommt es wenn sich Dateien/Verzeichnisse, die man lokal bearbeitet hat, seit dem letzten update im Repository verändert haben. Dann hat man zwei Möglichkeiten:

1) Man verwirft die lokalen Änderungen mit dem Befehl revert

Syntax:
svn revert PFAD...

Beschreibung:
Verwirft alle lokalen Änderungen, die an PFAD gemacht wurden und löst den Konfliktzustand auf.


2) Man löst den Konflikt per Hand auf (merge genannt) und teilt dies Subversion mittels resolved mit. Danach ist ein commit wieder möglich.

Syntax:
svn resolved PFAD...

Beschreibung:
Löscht die Konfliktmarkierung für die in PFAD angegebenen Daten.

5) Wie bekomme ich heraus, was sich in einzelnen Versionen verändert hat?

Um einen schnellen Überblick zu bekommen, was sich seit dem letzten Update verändert hat, ist der Befehl status gedacht. Gibt man bei dessen Aufruf die Option --show-updates an, so wird eine Verbindung zum Repository hergestellt, um zu prüfen, ob es dort Aktualisierungen gab. Ohne den Parameter werden nur die lokalen Änderungen angezeigt. Um zu sehen, wie sich der Inhalt einer Datei zwischen zwei Versionen geändert hat, dient der Befehl diff.

Syntax (status):
svn status [PFAD...]

Beschreibung (status):
Gibt den Status der lokalen Kopie (Dateien und Verzeichnisse) aus. Ohne Argumente werden nur lokale Änderungen dargestellt. Wird das Argument --show-updates (bzw. -u) angegeben, so werden auch  Änderungen im Repository  (z.B. out-of-date, falls die Datei seit dem letzten checkout/update aktualisiert wurde) angezeigt.

Die ersten 6 Spalten der Ausgabe sind jeweils ein Zeichen lang und geben den Status der Datei an.

Die erste Spalte zeigt Änderungen bzgl. Hinzufügen, Löschen oder anderer Veränderungen:
leer Datei wurde nicht modifiziert
A Datei ist für das hinzufügen vorgesehen (add)
D Datei ist für das löschen vorgesehen (delete)
M Datei wurde modifiziert
R Datei wurde ersetzt (replace)
C Datei befindet sich in einem Konfliktzustand (conflict)
? Datei steht nicht unter Versionskontrolle
! Datei fehlt (Wurde außerhalb von Subversion gelöscht oder ein checkout ist fehlgeschlagen)

Die zweite Spalte  stellt den Status der Eigenschaften (Properties) der Datei/des Verzeichnisses dar:

leer Keine Veränderungen der Eigenschaften vorgenommen
M Eigenschaften wurden verändert
C Eigenschaften befinden sich im Konfliktzustand

Die dritte Spalte enthält nur Einträge, wenn das Verzeichnis der working copy gelockt ist:

leer Verzeichnis ist nicht gesperrt
L Verzeichnis ist gesperrt

Die vierte Spalte ist nur belegt, falls Dateien samt Historie importiert werden.
Die fünfte Spalte enthält Einträge über verschobene Kopien.

Die sechste Spalte enthält Informationen über Schlösser (im Gegensatz zur vierten Spalte für einzelne Dateien):

leer Datei ist nicht gelockt
K Datei ist in dieser working copy gesperrt
O Datei wurde von einem anderen Benutzer gesperrt
T Das Lock wurde gestohlen und die Datei ist im Repository gesperrt
B Das Lock wurde gestohlen,  aber die Datei in im Repository nicht gesperrt

Wird beim Aufruf die Option --show-updates angegeben, so wird auch noch eine siebte Spalte angezeigt, welche die out-of-date-Informationen anzeigt:

leer Datei ist noch aktuell
* Es gibt eine neuere Version im Repository

Syntax (diff):
svn diff ALTE-URL[@ALTE-REV] NEUE-URL[@NEUE-REV]

Beschreibung (diff):
Zeigt die Unterschiede zwischen den Dateiinhalten von ALTE-URL bzgl NEUE-URL (falls angegeben jeweils in einer gewünschten Revision). Neue Zeilen sind mit "+++" gekennzeichnet, entfernte Zeilen mit "---". Wird die ALTE-URL weggelassen, so wird zum Vergleich die Version im aktuellen Arbeitsverzeichnis herangezogen.

6) Wie kann ich mir den Inhalt von Dateien im Repository anzeigen lassen ohne meine Kopie zu verändern?

Möchte man sich den Inhalt einer Datei im Repository ansehen, ohne seine lokale Kopie zu aktualisieren oder auf eine alte Revision zurückzusetzen, kann man dazu den Befehl cat benutzen. Dies ist z.B. dann sinnvoll, wenn der status-Befehl einem eine Aktualisierung im Repository signalisiert oder man sich schnell mal ansehen will, wie die Datei vorgestern aussah.

Syntax:
svn cat URL[@REV]...

Beschreibung:
URL beschreibt den Pfad zur anzuzeigenden Datei. Mit REV kann optional die Revision angegeben werden. Wird dieser Parameter weggelassen, so wird die letzte verfügbare Version angezeigt.

7) Wie kann ich Dateien/Verzeichnisse hinzufügen, umbenennen, löschen, kopieren oder verschieben?

Möchte man eine neue Datei zum Repository hinzufügen oder eine vorhandene löschen, verschieben oder kopieren, so muß man dafür auf den jeweiligen Subversionbefehl zurückgreifen, da Subversion lokal Statusinformationen zu allen Dateien speichert. Verändert man nun die Datei- bzw. Verzeichnisstruktur, so kann Subversion die Änderungen nicht mehr nachvollziehen und die working copy kann nicht mehr verwendet werden.

Wichtig ist bei allen diesen Befehlen, daß sie nur auf den lokalen Daten unmittelbar sichtbar sind. Auf das Repository wirken sich die Änderungen erst nach einem commit aus.

Syntax:
svn {add | delete | mkdir} PFAD...

Beschreibung:
Erstellt, löscht die Datei bzw. das Verzeichnis, welche(s) unter PFAD angegeben wurde.


Syntax:
svn {copy | move} QUELLE ZIEL

Beschreibung:
Kopiert bzw. verschiebt QUELLE nach ZIEL.

8) Wie kann ich Dateien/Verzeichnisse für andere sperren bzw. wieder freigeben?

Neben der Standardmethode zum gemeinsamen Arbeiten (copy-modify-merge) bietet Subversion auch noch die Möglichkeit Dateien, die man exklusiv bearbeiten möchte, mit Schlössern (Locks) zu sperren. Hat man ein solches Schloß für eine Datei oder ein Verzeichnis angefordert kann kein anderer Client mit der Datei arbeiten, bis man selber das Schloß freigibt. Möchte man alle Schlösser seiner working copy freigeben benutzt man dazu am besten den Befehl cleanup. Dadurch werden auch vergesse Locks wieder frei.

Das Benutzen von Locks wird nur für Binärdateien empfohlen, da bei ihnen ein zeilenweises diff keinen Sinn macht.

Syntax (lock):
svn lock PFAD

Beschreibung (lock):
Fordert ein Lock für die Datei/das Verzeichnis PFAD an. Falls die Datei schon von einem anderen Client gelockt wurde, wird ein Fehler ausgegeben.


Syntax (unlock):
svn unlock PFAD

Beschreibung (unlock):
Gibt das Schloß für die unter PFAD angegebenen Ressourcen wieder frei.


Syntax (cleanup):
svn cleanup [PFAD...]

Beschreibung (cleanup):
Entfernt rekursiv alle Locks und beendet angefangene Operationen. Wird kein PFAD angegeben, so wird das aktuelle Arbeitsverzeichnis aufgeräumt.

9) Wo bekomme ich weitere Hilfestellungen?

Um sich schnell die genaue Syntax eines bestimmten Befehls anzusehen ist help der wichtigste Befehl. Möchte man eine ausführliche Übersicht der Befehle mit Anwendungsbeispielen, so wirft man am besten einen Blick in das offizielle Subversionbuch. Die Befehlsreferenz ist unter http://svnbook.red-bean.com/nightly/en/svn.ref.html zu erreichen.

Syntax:
svn help [BEFEHL]

Beschreibung:
Liefert einen Hilfetext zum angegebenen Befehl.