Die Installation
Dank des Advance Packaging Tool gestaltet sich die Installation der Subversion (kurz SVN) Basis-Software selbst, erfrischend einfach und unkompliziert. Die Verwendung des Befehls apt-get setzt selbstverständlich Root-Rechte voraus.
sudo apt-get install subversion
Das Paket “subversion” enthält diverse Tools und selbstverständlich die SVN Library. Auf Grundlage dieses einen Pakets wurden im Prinzip alle nötigen Programme installiert, die gebraucht werden, um ein lokales Repository in Betrieb nehmen und pflegen zu können.
Das lokale Repository
Im Gegensatz zu anderen Programmen zur Versionsverwaltung, zum Beispiel Perforce, bietet Subversion die Möglichkeit lokale Repositories anzulegen. Diese Variante ist insbesondere dann nützlich, wenn es sich nicht um ein Projekt mit einem verteiltem Benutzerstamm handelt. Ein lokales Repository ist zum Beispiel ideal dazu geeignet, sich bei eigenen kleinen Projekten das ständige Rücksichern verschiedener Zwischenstände zu ersparen. Nie wieder Tarball Chaos! Nie wieder Hände über den Kopf zusammen schlagen, weil man das Backup vergessen hat! Wie praktisch! Selbstverständlich ist auch hierbei immer noch ein gewisses Maß an Selbstdisziplin vorausgesetzt, wenn es um das Hinzufügen der gemachten Änderungen geht.
Doch bevor man sich mir dererlei Problemen befasst, muss natürlich ersteinmal ein funktionierendes Repository angelegt werden. Die SVN eigenen Tools werden alle grundsätzlich in der Konsole ausgeführt. Es gibt mittlerweile eine Vielzahl grafischer Frontends für SVN, auf die ich allerdings an anderer Stelle noch zu sprechen komme.
Ein lokales Subversion Repository anzulegen ist nahezu ein Kinderspiel. Wenn das neue Repository Beispielsweise “BillingApp” heißen soll, legt man es mit folgender Kommandozeilen Eingabe an:
svnadmin create BillingApp
Der Befehl svnadmin bietet eine ganze Reihe weiterer Möglichkeiten zur Verwaltung eines Repositories, die als entsprechender Parameter mitgegeben werden. Viel wichiger allerdings ist der svn Befehl selbst. Sämtliche inhaltliche Änderungen in einem Repository, werden mit dem Konsolenkürzel svn und einem entsprechenden Befehlsparameter durchgeführt. Einige weitere wichtige SVN Befehlsparameter die man beim einrichten eines Repositories gebrauchen kann sind:
- svn import [Lokaler-Pfad] [Ziel-URL] — Importiert eine lokale Datei oder ein Verzeichnis in das Repository.
- svn mkdir [Ziel-URI] — Erstellt ein neues Verzeichni, bestimmt durch die absolute Verzeichnis-URL.
- svn list file [Ziel-URI] — Listet alle Inhalte des bestimmten Verzeichnisses.
- svn move [URI1] [URI2] — Verschieben oder umbenennen von Dateien in Arbeitskopie und Repository.
- svn delete [URI] — Löscht Dateien und Verzeichnisse aus dem Repository.
Der aufmerksame Leser wird festgestellt haben, dass in der Befehlsyntax zumeist die rede von einer URI ist. Das liegt daran, dass die Inhalte eines Repositorys in einer Art virtuellem Dateisystem gehalten werden. Der tatsächliche Inhalt des Beispielordners “BillingApp” sieht wie folgt aus:
drwxr-xr-x 2 dennis dennis 80 2007-03-07 15:42 conf
drwxr-xr-x 2 dennis dennis 48 2007-03-07 15:42 dav
drwxr-sr-x 2 dennis dennis 472 2007-03-07 15:42 db
-r--r--r-- 1 dennis dennis 2 2007-03-07 15:42 format
drwxr-xr-x 2 dennis dennis 232 2007-03-07 15:42 hooks
drwxr-xr-x 2 dennis dennis 104 2007-03-07 15:42 locks
-rw-r--r-- 1 dennis dennis 379 2007-03-07 15:42 README.txt
Auf genauen Zwecke der einzelnen Dateien und Verzeichnisse gehe ich an dieser Stelle nicht ein. Vorerst reicht es zu wissen, dass es sich hierbei um Dateien handelt, die Subversion benötigt, um die Resourcen verwalten und versionieren zu können.
Um auf die Inhalte des Repositorys Zugriff nehmen zu können, übergibt man dem Befehl svn also URIs, anstelle des tatsächlichen Dateisystempfades. Subversion wandelt die URI dann intern entsprechend sich um. Importiert man Beispielsweise ein lokales Projekt in ein lokales Subversion Repository, so lautet der Befehl
svn import /home/dennis/projekt_verzeichnis/* file:///home/dennis/BillingApp
Die Angabe von URIs ist die einzige Möglichkeit, an die zu verwaltenen Dateien zu gelangen. Denn alle verwalteten Dateien liegen in einer Art virtuellem Dateisystem (bzw. einer Datenbank). Für den Befehl svn sind die Inhalte der Verzeichnisse /home/dennis/BillingApp und file:///home/dennis/BillingApp also von Grund auf verschieden. Bei dem ersten Pfad sieht svn die “System-Dateien” (conf/, dav/, db/ usw.), die man auch mit den Befehlen dir oder ls sehen würde. Beim zweiten Pfad (der File-URI) bekommt svn Einsicht/Zugriff auf alle “versionierten Dateien”, quasi die konkreten Quelltexte, Dokumente etc. mit denen eigentlich gearbeitet werden soll. Beide Zugriffsmethoden (echter Dateipfad und File-URI) haben absolut von einander abgegrenzte Umgebungen. Die Inhalte dieser Umgebungen werden niemals vermischt.
Zum anderen ist es Subversion auf diese Art möglich, die selben Befehle für lokale und entfernte Repositories nutzen zu können. Worauf man lediglich achten muss, ist dass man das Format der URI einhält. Der gleiche Aufruf für den Import in ein entferntes Repository könnte dann zum Beispiel so aussehen:
svn import /home/dennis/projekt_verzeichnis/* svn://myhost.com/BillingApp
Bei einem URI mit dem Schema “svn” weiss Subversion, dass es sich um ein entferntes Repository handelt und reagiert entsprechend um die Dateien zu übertragen. An dieser Stelle beginnt die Thematik der entfernten Repositories.
Das entfernte Repository
Jedes entfernte Repository setzt auf einem lokalen Repository auf. Es wird lediglich ein Dienst gestartet/installiert der dafür sorgt, dass man auch von außerhalb zugreifen kann. Hier gibt es nun diverse Möglichkeiten. In diesem Text beschäfftigen wir uns mit dem Subversion eigenen Daemon svnserve.
Svnserve ist in der Regel von Haus aus in der Subversion Grundausstattung enthalten. Das Programm bietet verschiedene Möglichkeiten, einen eigenen Repository Server in Betrieb zu nehmen:
- Als in inetd eingebundener Dienst.
- Als eigenenständiger Daemon Prozess.
- Über einen SSH/RSH Tunnel.
Wir beschäfftigen uns der Einfacheit halber mit der zweiten Variante, dem Betrieb als Daemon. Um einen einfachen svnserve Daemon zu starten, muss man in der Shell den Befehl svnserve –daemon ausgeführt werden. Damit wird ein neuer Prozess gestartet, der auf dem TCP Port 3690 wartet. Der Prozess wird in der Regel direkt in den Hintergrund geschoben. Soll dieses Verhalten vermieden werden kann der Parameter –foreground beigefügt werden. Außerdem empfehlen sich beim Betriebs von svnserve folgende Parameter anzugeben:
- –root arg: Legt das Verzeichnis fest, in dem alle Repositories dieses Daemons liegen sollen. Wir diese Option nicht gesetzt, kann per Default mit abosluten Pfadangaben, jedes Repository des Systems genutzt werden.
- –listen-host [arg] : Konfiguriert die Netzwerkadresse/Hostnamen auf dem der Subversion Server auf eingehende Verbindungen warten soll.
- –listen-port [arg] : Konfiguriert den Port auf dem der Subversion Server auf eingehende Verbindungen warten soll.
- –threads : Sollte abzusehen sein, dass der der Subversion Server einem starken Workload ausgesetzt sein wird, bietet es sich an dem Prozess über Threads anstelle von Forks laufen zu lassen.
Wenn das eigene Repository also in dem Pfad /var/svn/repositories liegt, bietet sich es also an, den Server wie folgt zu starten:
svnserve –daemon –root /var/svn/repositories
Hierbei ist natürlich wie immer darauf zu achten, dass das Verzeichnis /var/svn/repositories entsprechende Berechtigungen besitzt, damit der svnserve Prozess darauf zugreifen kann. Außerdem empfiehlt es sich in viele Fällen, den Zugriff auf das Repository zu beschränken. Dazu bringt Subversion zum Beispiel einen einfachen authentifizierungs Mechanismus mit. Jedes Repository-Verzeichnis enthält die Datei svnserve.conf im Unterverzeichnis conf/. Die accountbasierte Grundkonfiguration im Handumdrehen eingerichtet. Die Datei svnserve.conf benötigt im Grunde genommen nur folgende drei Zeilen:
[general]
realm = My First Repository
password-db = passwd
In diesem Beispiel wird eine Kennwortdatei “passwd” benutzt die ebenfalls in conf/ liegen muss.
Zusätzlich hat man die Möglichkeit, über den Parameter anon-access und auth-access die Berechtigung für anonyme und authorisierte Zugriffe auf das Repository zu bestimmen.
Ist das Remote Repository so weit nun aufgesetzt, kann von jedem Rechner im Netz mit dem Commandline Tool svn auf das Repository zugegriffen werden. Genauere Informationen zu Subversion kann man wie immer den Manpages und Beispielkonfigurationen entlocken.