Intern
Subversion (SVN)
SVN ist ein Programm zur Versionsverwaltung von Dateien und Verzeichnissen. Dabei werden die verschiedenen Versionen der Dateien in einem sog. Repository auf einem zentralen Server gespeichert. Die Bearbeitung erfolgt in einer lokalen Arbeitskopie des Repositories, die über spezielle Kommandos mit dem Server synchronisiert werden kann.
Wir verwenden SVN in den Übungen, da es das gemeinsame Arbeiten mit mehreren Personen an denselben Dateien besser strukturieren und somit vereinfachen kann.
Hierfür bekommt jede Gruppe ein eigenes Repository, welches über folgende URL zur Verfügung steht:
https://stud.fh-wedel.de/repos/uebungen/
<Übungskürzel>/
<Übungskürzel>_
<Gruppennummer>
Das Übungskürzel ist oop
, unix
, usw.
Im Repository sind bereits Verzeichnisse für die einzelnen Aufgaben (ueb01
,
ueb02
, …) vorhanden.
Benutzung
Allgemeiner Ablauf
- Inhalt des Repositories in eine lokale Arbeitskopie laden (
checkout
bzw.update
)
Ein “checkout” wird nur beim ersten Mal benötigt, um die Arbeitskopie neu anzulegen. Ein “update” aktualisiert eine bestehende Arbeitskopie mit den aktuellen Daten aus dem Repository. - Dateien in der lokalen Arbeitskopie verändern
Existierende Dateien können einfach geändert werden, neu angelegte Dateien oder Verzeichnisse müssen vor dem nächsten “commit” zunächst mit einem “add” in die Versionsverwaltung aufgenommen werden. - Änderungen an den Server senden (
commit
)
Die Änderungen können dann mit einem “update” in einer anderen, bereits existierenden Arbeitskopie heruntergeladen werden.
Für die Verwaltung des Repositories und die Synchronisation mit einer
Arbeitskopie wird ein SVN-Client benötigt.
Unter Linux heißt das Programm schlicht svn
.
Die auszuführende Aktion kann dem Programm als Parameter mitgeteilt werden.
Auschecken eines Repositories
Um eine lokale Arbeitskopie eines Repositories zu erstellen, um mit dieser
arbeiten zu können, kann der Befehl svn checkout
verwendet werden:
svn checkout "
<URL des Repositories>" "
<lokales Zielverzeichnis>"
Beispiel:
svn checkout "https://stud.fh-wedel.de/repos/uebungen/oop/oop_42/ueb01" "oop-a1"
Dieser Befehl erzeugt ein Verzeichnis oop-a1
, in dem alles enthalten ist, was
auch im Repository der Gruppe 42
unter dem Ordner ueb01
eingecheckt ist.
In diesem Verzeichnis kann nun gearbeitet werden (unabhängig davon, wie sich die
Version des Repositories auf dem Server verändert).
Zum Testen eurer Lösungen werden wir genau diesen Befehl verwenden und erwarten,
dass auch alle benötigten Quelldateien direkt im Verzeichnis der jeweiligen
Aufgabe liegen!
Der letzte Parameter (das lokale Zielverzeichnis) kann weggelassen werden.
In dem Fall wird das aktuelle Verzeichnis verwendet.
Es können auch alle Aufgaben-Ordner in eine einzige Arbeitskopie ausgecheckt
werden.
Hierfür muss lediglich die Angabe des letzten Ordners in der URL weggelassen
werden.
Einpflegen von Änderungen in das Repository
Änderungen an Dateien bzw. Verzeichnissen werden in der Versionsverwaltung SVN in sog. Commits zusammengefasst. Jeder commit verändert die Version (revision) des Repositories und sollte mit einem Kommentar näher beschrieben werden.
Änderungen an Dateien oder Verzeichnissen in der Arbeitskopie werden daher mit dem Befehl
svn commit
zum Server übertragen. Der Befehl muss innerhalb des ausgecheckten Verzeichnisses (der Arbeitskopie) ausgeführt werden.
Für die Eingabe eines Kommentars öffnet der SVN-Client vor der Übertragung zum
Server den Standard-Editor.
Alternativ kann der Kommentar auch als Kommandozeilenparameter übergeben werden:
svn commit -m "Kommentar"
.
Tipp: Mit svn status
kann eine Liste der Änderungen angezeigt werden.
Sollte sich die Version des Repositories während der lokalen Bearbeitung geändert haben (die entfernte Revisionsnummer ist größer als die lokale), kann der Commit (noch) nicht durchgeführt werden. In diesem Fall muss die lokale Arbeitskopie erst mit einem “update” aktualisiert werden.
Aktualisieren der lokalen Arbeitskopie
Zur Synchonisation der Arbeitskopie mit dem Repository (beispielsweise, wenn ein anderer Nutzer mit einem Commit Änderungen an den Server übertragen hat) dient der Befehl:
svn update
Hierbei werden die aktuellen Daten vom Server geladen und damit die lokalen Daten aktualisiert. Das Repository auf dem Server wird dabei nicht verändert.
Bei einem “update” kann lokal ein Konflikt entstehen, wenn der SVN-Client es nicht schafft, alle Änderungen (die vom Server geladenen, und eventuell lokal vorgenommene Änderungen) überschneidungsfrei anzuwenden. Dies ist beispielsweise der Fall, wenn zwei Nutzer gleichzeitig dieselbe Stelle einer Datei verändern. Der Konflikt muss dann vom Nutzer selbst gelöst werden. Der SVN-Client kennzeichnet die betroffenen Stellen zu diesem Zweck in den Dateien.
Hinzufügen von Dateien/Verzeichnissen
In einer lokalen Arbeitskopie neu angelegte Dateien und Verzeichnisse
werden von SVN bei einem commit
(siehe unten) noch nicht berücksichtigt.
Diese müssen vorher mit folgendem Befehl erst in die Versionsverwaltung von SVN
aufgenommen werden:
svn add "
<Datei- oder Verzeichnisname>"
Beispiel:
svn add "neue_Datei"
Beim Hinzufügen von Verzeichnissen werden automatisch auch alle darin enthaltenen Unterverzeichnisse und Dateien hinzugefügt.
Entfernen von Dateien/Verzeichnissen
Um eine Datei oder ein Verzeichnis aus der Versionsverwaltung wieder zu entfernen, kann folgender Befehl verwendet werden:
svn delete "
<Datei- oder Verzeichnisname>"
Auch hier wird die Änderung erst mit dem nächsten svn commit
übertragen.
(Die Datei wird außerdem lokal gelöscht.)
Wird eine Datei oder ein Verzeichnis hingegen nur aus dem Dateisystem gelöscht,
ohne SVN dies mitzuteilen (z.B. mit rm
anstatt svn delete
), wird sie/es mit
dem nächsten svn update
wiederhergestellt.
Weitere Hinweise
Was sollte eingecheckt werden und was nicht?
Prinzipiell ist es ratsam alles einzuchecken, was für das Projekt benötigt wird. Insbesondere Quelldateien und Makefiles, die zum Erzeugen des ausführbaren Programms benötigt werden. Das kompilierte Programm, und alle anderen Dateien die automatisch generiert werden können, sollten jedoch nicht in die Versionsverwaltung aufgenommen werden.
Abkürzungen für Befehle
Zu den meisten Befehlen gibt es Kurzformen, z.B. up
für update
, co
für
checkout
, ci
für commit
.
svn help
liefert auch hier eine gute Übersicht.
Weiterführende Links
Nachfolgend einige Internet-Quellen zu Subversion und dem Kommandozeilen-Client
svn
:
- offizielle Subversion-Homepage
Zentrale Anlaufstelle zum Thema Subversion. Ankündigungen, Downloads, FAQs und vieles mehr. - DAS Subversion-Buch
Kostenlose Online-Version von “Version Control with Subversion”, dem offiziellen Buch zu Subversion. - Subversion Cheat Sheet (PDF)
Kurzübersicht aller SVN-Befehle
Grafische Oberflächen
- TortoiseSVN
Ein einfach zu bedienender grafischer SVN-Client für Windows. - SmartSVN
Sehr umfangreicher grafischer SVN-Client für Windows, Linux und Mac.
Alternativen zu SVN
Wem Subversion zu zentralistisch ist, den könnte eine verteilte Versionsverwaltung interessieren. Dabei ist jede lokale Arbeitskopie auch ein Repository, wodurch man auch ohne Verbindung zum Server (z.B. unterwegs) vernünftig weiterarbeiten kann. Verteilte Versionsverwaltungen sind z.B. Darcs, Git und Mercurial.