Die Versionsverwaltung Subversion
Willemers Informatik-Ecke

Client-Einrichtung

Linux-Installation

Der Client für Linux wird bei Debian, Ubuntu und Linux Mint mit dem folgenden Befehl installiert:
# apt install subversion
Bei anderen Linux-Varianten dürfte das Paket vermutlich gleich heißen.

Windows-Client

Wer noch unter Windows arbeitet, kann die grafische Oberfläche TortoiseSVN nutzen.

Ein lokales Repository

Soll Subversion in erster Linie dazu dienen, eine Historienverwaltung auf einem einzelnen Rechner zu realisieren, kann man ein lokales Repository anlegen.

Die Schritte entsprechen denen, wenn man ein zentrales Repository auf dem Server hält. Insofern ist es nicht verkehrt, diese Schritte zunächst zu verstehen.

Die gleiche Vorgehensweise kann man natürlich auch anwenden, wenn das Repository auf einem Netzwerklaufwerk wie etwa Samba oder NFS liegt. Dann ist das Repository auch von mehreren Benutzern erreichbar. Aus Sicherheitsgründen sollte man davon allerdings Abstand nehmen, sondern dann lieber einen netzwerkweiten Server mit HTTP oder SSH anlegen.

Anlegen eines Repositories

Mit dem folgenden Befehl wird ein leeres Repository angelegt. Es entsteht in dem aktuellen Verzeichnis ein (verborgenes) Verzeichnis .svn.
$ svnadmin create /home/johannes/svn

Dateien in das Repository einsetzen

In das Verzeichnis mit dem Quelltext wechseln und dort den aktuellen Stand als Basis für die Versionsverwaltung speichern.
$ cd ~/src/cpp/meinProjekt
$ svn import file:///home/johannes/svn/meinProjekt -m "Erster Stand"
Die Dateien im Verzeichnis werden hinzugefügt und als Revision 1 übertragen.

Die Option -m ermöglicht die Angabe eines Versionskommentars. Der ist zwingend. Wird er nicht per -m angegeben, wird man aufgefordert diesen direkt am Terminal einzugeben.

Einen Stand auschecken

Soll ein neues Arbeitsverzeichnis angelegt werden, um beispielsweise etwas auszuprobieren, wird ein Checkout durchgeführt.
$ cd ~/tmp/test
$ svn checkout file:///home/johannes/svn/meinProjekt

Arbeiten am Source-Code

Wenn man am Source-Code ändert, kann man sich den Status anzeigen lassen.
$ svn status
?       neu.cpp
M       paint.cpp
Die Datei paint.cpp wurde geändert, die Datei neu.cpp neu angelegt. Subversion weiß allerdings noch nichts davon und wird sie ignorieren.

Neue Datei zum Subversion hinzufügen

Die neue Datei wird zum Status hinzugefügt.
$ svn add neu.cpp
$ svn status
A       neu.cpp
M       paint.cpp
Beim Hinzufügen eines Verzeichnisses werden automatisch alle enthaltenen Dateien zum Repository hinzugefügt.

Dateien aus dem Repository löschen

Durch den Befehl delete oder rm wird eine Datei aus dem Repository entfernt. Gleichzeitig wird auch die lokale Datei gelöscht.
$ svn delete mist.cpp

Vergleich mit dem alten Repository-Stand

Bei der Datei paint.cpp liegen also Änderungen gegenüber dem Stand im Repository vor. Diese kann man sich mit dem folgenden Befehl anzeigen lassen.
$ svn diff neu.cpp

Lesen des aktuellen Stands aus dem Repository

Um ein eigenes Arbeitsverzeichnis gegenüber einem Repository auf den aktuellen Stand zu bringen, wird er per Update aktualisiert.
$ svn update

Übernahme der Änderungen in das Repository

Letztlich sollen die Änderungen natürlich in der Versionskontrolle gespeichert werden. Dazu wird ein Commit durchgeführt.
$ svn commit -m "Farbfehler beseitigt, Schattierung neu"

Rückname der Änderungen

Solange der Stand noch nicht per commit gesichert wurde, können die Aktionen mit dem Befehl revert zurückgenommen werden. Als Argument wird der Dateiname angegeben.
$ svn revert dochkeinmist.cpp

Subversion Server auf HTTP-Basis einrichten

Ein zentraler Subversion-Server sollte aus verschiedenen Gründen keinesfalls auf der Basis eines Netzlaufwerkes eingerichtet werden. Stattdessen empfiehlt es sich, den Server auf der Basis des Web-Servers Apache einzurichten. Damit kann Subversion das Protokoll HTTP nutzen.
# apt install apache2 libapache2-mod-svn
Für die Konfiguration findet man im Verzeichnis /etc/apache2/mods-available die Datei dav_svn.conf. Die Minimaleinrichtung wird durch entkommentieren (entfernen der #-Zeichen) aktiviert und sieht dann so aus:
<Location /svn>
  DAV svn
  # SVNPath /var/lib/svn
  SVNParentPath /var/lib/svn
</Location>
Mehrbenutzer ist auch möglich:
<Location /svn>
  DAV svn
  # SVNPath /var/lib/svn
  SVNParentPath /var/lib/svn
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
  Require valid-user
</Location>
Sofern nicht HTTPS verwendet wird, werden allerdings die Passwörter unverschlüsselt übertragen.

Für die Mehrbenutzervariante müssen die Passwörter gesetzt werden.

# htpasswd -c /etc/apache2/dav_svn.passwd johannes
New password: 
Re-type new password: 
Adding password for user johannes
# 
Nun muss das Modul noch aktiviert werden.
# a2enmod dav_svn
Außerdem werden Sie aufgefordert, Apache neu zu starten.
# systemctl restart apache2
Vor eine Benutzung muss das Verzeichnis eingerichtet werden, das Repository angelegt, die Zugriffsrechte für den Apache-Server eingerichtet und der Apache neu gestartet werden.
# mkdir /var/lib/svn
# svnadmin create /var/lib/svn/src
# chown -R www-data /var/lib/svn/
# systemctl restart apache2.service
systemctl restart apache2.service ersetzt das ältere /etc/init.d/apache2 restart

Erzeugung eines SVN-Servers und Einrichtung mit SSH

Wechsel auf den Server und Einrichtung eines leeren Repositories:
user@clt ~ $ ssh server
Password ...
user@server ~ $ svnadmin create ~/svn
Wieder zurück zum Client. Dort wird das Repository ausgecheckt und damit eine Arbeitsumgebung geschaffen.
$ svn checkout svn+ssh://user@server/home/user/svn
Damit entsteht ein lokales Verzeichnis svn, das ein Verzeichnis .svn enthält, wie man es mit dem Befehl ls -la sehen kann.
user@clt ~ $ cd svn
user@clt ~/svn $ ls -la
insgesamt 8
drwxrwxr-x  6 user user 4096 Nov  2 12:44 .
drwxrwxr-x  3 user user 4096 Nov  2 12:38 ..
drwxrwxr-x  4 user user 4096 Nov  2 12:38 .svn
Nun kann man darin die zu versionierenden Dateien ablegen. Entweder einzeln oder durch Kopieren eines kompletten Projekts.
user@clt ~/svn $ tar xfz ../../svn.tgz 
Nehmen wir an, dass in der Tar-Datei die Verzeichnisse src, texte und web befanden. Dann können diese nun der Versionsverwaltung mit dem Befehl svn add hinzugefügt werden:
user@clt ~/svn $ svn add src texte web
Anschließend muss ein Commit erfolgen, der die Daten dann in das zentrale Repository auf dem Server einträgt.
user@clt ~/svn $ svn commit
Es erscheint ein Editor, in dem der Kommentar für das Einchecken hinterlegt wird. Nach Beendigen des Editors wandern alle Dateien ins zentrale Repository.

Anschließend kann an jedem Arbeitsplatz im Netzwerk in jedem beliebigen Verzeichnis der Checkout-Befehl gesetzt werden und der aktuelle Stand des Servers befindet sich dort.

user@client2 ~/work $ svn checkout svn+ssh://user@server/home/user/svn
Wird nun auf einem der Arbeitsplätze eine der versionierten Dateien geändert, wird der Befehl svn commit diese und eventuelle andere Änderungen in das Repository einpflegen und dazu einen Kommentar verlangen.
user@clt ~/svn $ svn commit
Auf den anderen Arbeitsplätzen werden mit dem Befehl svn update aktualisiert.
user@client2 ~/work/svn $ svn update
Aktualisiere ».«:
U    web/willemer.de/informatik/programmieren/subversion.htm
Aktualisiert zu Revision 2.

Datensicherung des Subversion

# svnadmin dump /var/lib/svn/src > svnsrc.dump
Zurückholen:
# svnadmin create /var/lib/svn/src
# svnadmin load /var/lib/svn/src < svnsrc.dump