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