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

  1. 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.
  2. 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.
  3. Ä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:

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.