Subversion
Neben CVS, Git und Bazaar stellt Subversion wohl das bekannteste Versionskontrollsystem dar. Der nachfolgende Artikel soll nicht nur die Installation und Konfiguration von Subversion beschreiben sondern auch einen Einblick in die von Subversion zur Verfügung gestellten Strukturen zur Versionierung von Dateien und Verzeichnissen verschaffen.
Struktur
Durch Subversion wird zunächst Speicherplatz für Dateien und Verzeichnisse, der unter Versionskontrolle steht, zur Verfügung gestellt. Dieser kann in Abhängigkeit zu den Anforderungen frei konfiguriert werden, für eine bessere Strukturierung steht allerdings das Tag- und Branchkonzept zur Verfügung, welches die Entwicklung in drei Blöcke unterteilt:
- trunk
- Der Ordner trunk enthält den Hauptentwicklungslinie
- tag
- Der Ordner Tag enthält so genannte Baselines. Dies sind Versionen der Software, die bei einem bestimmten Stand eingefroren und mit einem Namen versehen wurden.
- branch
- Der Ordner branch enthält die Forks der Hauptentwicklungslinie. Dies sind Entwicklungen, die zwar den gleichen Ursprung wie die Hauptentwicklungslinie haben, sich nun aber in eine neue Richtung entwickeln.
Anhand dieser Unterteilung können verschiedene Konfigurationen erstellt werden, einige dieser Konfigurationen sollen beispielhaft in der nächsten Grafik dargestellt werden:
- //gfx-here//
Es ist zu bemerken, dass die Unterteilung in trunk, tag und branch dabei nicht zwingend ist.
Grundinstallation / installierte Pakete
Als Basis für die unten beschriebene Installation dient ein Debian 6.0 "squeeze", wobei folgende Pakete zusätzlich installiert wurden:
- vim
- subversion
- apache2
- libapache2-svn
Konfiguration von Subversion
In diesem Block soll beschrieben werden, wie Subversion nach einer erfolgreichen installation konfiguriert wird, hierbei soll beschrieben werden, wie ein Repository angelegt wird und wie Benutzer und deren Rechte bei Subversion verwaltet werden.
Anlegen eines Repositories
Bevor ein Repository angelegt wird, soll mittels
root@debian:~# mkdir -p /var/svn
ein Verzeichnis erstellt werden, in welchem alle Repositories gespeichert werden sollen. Im Anschluß wird mit dem Befehl
root@debian:~# svnadmin create /var/svn/repository
ein Repositiory erzeugt. Da in der hier beschriebenen Konfiguration der Datentransfer später durch den Apache erfolgen soll, müssen die Verzeichnisse noch dem Apache-Benutzer zugeordnet werden, dieses geschieht mit:
root@debian:~# chown -R www-data:www-data /var/svn
Zugriffsverwaltung
Der angelegte Subversion-Repository kann nun bereits benutzt werden. Allerdings ist es oft wünschenswert den Zugriff auf einzelne Repositories zu beschränken. Die Konfiguration für den Zugriff erfolgt mittels einer Kombination aus Access Controll List und Benutzerverwaltung. Aus diesem Grund müssen für beide Komponenten zunächst die zwei Dateien
root@debian:~# touch /var/svn/acl /var/svn/user
angelegt werden.
Benutzerverwaltung
Die Benutzerverwaltung geschieht einfach mittels htaccess Datei, welche die Syntax
$user:$hash
für den Benutzer $user mit dem Passwort-Hash $hash besitzt. Dabei wird ein Benutzer einfach mittels
root@debian:~# htpasswd /var/svn/user $user
erstellt.
Access Control List
Die Einschränkung der Zugriffsrechte auf ein Repository oder auf einen Teil eines Repositories erfolgt mittels Access Control List, welche die Syntax
[$repo:$path]
$user = $perm
@$group = $perm
besitzt. Den einzelnen Elemente können dabei folgende Werte zugewiesen werden.
- $repo
- Name des Repositories, welches mittels svnadmin create angelegt wurde.
- $path
- relativer Pfad zu dem Teil des Repositories, für den diese Regel gelten soll. Falls die Regel für das gesamte Repository definiert werde, ist der Pfad ein einfacher Slash ("/").
- $user oder @$group
- Er definiert die Benutzer, für die diese Regel gelten soll. Falls eine globale Regel eingerichtet werden soll, kann dies mit mittels "*" geschehen. Ansonsten kann entweder ein Benutzername aus der htaccess-Datei oder ein Gruppenname (siehe unten) angegeben werden.
- $perm
- In der ACL wird zwischen verschiedenen Rechten unterschieden, dies ist zum einen das Lese-Rechte (r), hierbei dürfen Benutzer ausschließlich Objekte auschecken (auf ihr eigenes System kopieren). Während dürfen bei Lese-/Schreib-Rechten (rw) Objekte sowohl aus- als auch eingecheckt werden.
Beispiel
Die in der nachfolgenden Beispieldatei erwähnten Benutzer (fmueller, pschmidt, hmustermann) müssen in der .htaccess definiert sein.
[groups]
@Developer = fmueller, pschmidt
# Benutzer der Gruppe Developer duerfen Dateien und Verzeichnisse aus dem
# Repository foobar aus- und einchecken, während der Benutzer hmustermann
# nur Dateien auschecken darf.
[foobar:/]
@Developer = rw
hmustermann = r
# Benutzer fmueller darf Dateien und Verzeichnisse aus dem Entwicklungszweig
# trunk im Repository test aus- und einchecken, waehrend alle anderen
# ausschliesslich Dateien- und Verzeichnisse auschecken duerfen.
[test:/trunk]
fmueller = rw
* = r
Konfiguration vom Apache
Definition eines vHosts
Es ist zumeist am sinnvollsten für Subversion eine eigene Subdomain anzulegen. Dieses erfolgt am einfachsten, indem man im Verzeichnis /etc/apache/sites-available/ eine neue Konfigurationsdatei folgendem Inhalt angelegt:
<VirtualHost *:80>
ServerName svn.example.com
<Location />
DAV svn
SVNParentPath /var/svn/
AuthType Basic
AuthName "Test"
AuthUserFile /var/svn/users
AuthzSVNAccessFile /var/svn/acl
Require valid-user
</Location>
LogLevel info
</VirtualHost>
Erwähenswert ist die Tatsache, dass SVNParentPath auf genau das Verzeichnis verweissen muss, in dem die Repositories gespeichert werden. Falls in der Subdomain ein explizites Subversion-Repository verwendet werden soll, muss der Eintrag:
SVNPath /var/svn/repository
lauten. Alle weiteren Parameter in der Datei sollten selbsterklärend sein und können ggf. in der [Referenz zum Authentifizierungsmodul] auf der Homepage vom Apache-Projekt nachgelesen werden.
Aktivieriung des vHosts
Nach diesen Anpassung genügt es, die vHost-Datei in das Verzeichnis /etc/apache2/sites-enabled mittels
root@debian:~# cd /etc/apache2/sites-enabled
root@debian:~# ln -s ../sites-available/svn.example.com svn.example.com
oder
root@debian:~# a2ensite svn.example.com
zu verlinken und den Webserver mittels
root@debian:~# /etc/init.d/apache2 restart
neu zu starten.