Ein Vorfahre von Versionsmanagement-Programmen ist RCS - das Revision Control System. Auf dieser Basis entwickelte sich CVS - das Concurrent Versioning System mit vielen Verbesserungen, um Entwicklern die Arbeit zu erleichtern. CVS ist von Anwendern sehr einfach zu bedienen; selbst ein Einsteiger versteht binnen Minuten, was cvs update und cvs commit bewirkt - um den Rest kümmert sich die Software selbst. Der Erfolg - aber vor allen Dingen die Grenzen von CVS - hat zur Implementation von subversion geführt. Subversion wird mit seiner Fertigstellung verschiedene Schönheitsfehler von CVS beheben: Es soll Binaries ordentlich verwalten, Dateien, Verzeichnisse und symbolische Links werden der Versionskontrolle unterliegen. Von vielen Entwicklern benötigt, sollen wichtige Aktionen wie move bei Fertigstellung funktionieren. Ganz fertig gestellt ist subversion noch nicht - viele Features befinden sich noch in der Implementation. Trotzdem funktioniert subversion heute gut genug, um ein paar neugierige Blicke darauf zu werfen.
Installation
Die Installation von subversion ist nicht schwierig: Für den Single-User Modus braucht man nur subversion, Berkeley-DB 4.x, den XML-Parser Expat und ein installiertes Python 2.x. und kann die Netzwerkkomponenten einfach weglassen. Für ein netzwerktaugliches subversion braucht man ein paar Komponenten mehr: Die Sourcen von Apache 2, die Neon-Library für WebDAV und die OpenSSL-Bibliotheken, um eine verschlüsselte Übertragung zu gewährleisten. Apache 2 übernimmt mittels HTTP 1.1 die Arbeit des Transports der Daten übers Netz. WebDAV erledigt später bestimmte Zugriffe auf das Repository. subversion, WebDAV und OpenSSL lädt der Apache automatisch. Sowohl für den Netzwerkbetrieb als auch lokal benötigt man Berkeley-DB als Backend zur Aufbewahrung der verwalteten Daten. Durch die Delegierung der Netzwerkfähigkeit an Apache fallen bei subversion Arbeitsweisen wie der pserver unter CVS weg. Das Anmelden am subversion-Server funktioniert über htaccess-Passworte und andere Mechanismen, die der Apache beherrscht. Für den Administrator bedeutet dies natürlich, dass er sich mit grundlegenden Verwaltungsarbeiten am Apache vertraut machen muss. Wer sich mit Apache und WebDAV gar nicht anfreunden kann, erhält in den Sourcen von subversion übrigens auch einen kleinen subversion-Server svnserve, der als Dämon läuft. Die Installation für den lokalen Modus ohne Netz - gut geeignet für erste Tests - erfordert zuerst die Installation von Berkeley-DB und Expat. Beide sind voneinander unabhängig und lassen sich leicht mit configure, make, make install installieren. Wer kein Python 2.x hat, braucht dies auch nur für den Buildvorgang - man muss also nicht erst das neue Python gegen Expat und Berkeley-DB linken. Nach dem Auspacken der Sourcen von subversion ruft man./configure --with-berkeley-db=/pfad/zu/db4 auf.
svnadmin create SVNsvn: General filesystem error svn: bad database version: got 3.1.17, should be at least 4.0.14
./configure --enable-dav \ --enable-so \ --with-dbm=db4 \ --with-berkeley-db=/pfad/zu/berkeleydb4
./configure --with-berkeley-db=/pfad/zu/db4 \ --with-apxs=/apachepfad/bin/apxs
<Location /SVN>DAV svnSVNPath /var/SVN</Location>
Trunk, Branch, Tag - Grundbegriffe in subversion
Die Grundbegriffe von subversion kennen die meisten Benutzer bereits aus der CVS-Welt: Das Repository ist die komplette Datenstruktur, die in CVS als Dateien und Verzeichnisse auf der Festplatte gehalten wird. In subversion erledigt dies Berkeley-DB. Ein Projekt ist eine Unterstruktur innerhalb eines Repositorys - ganz banal das entsprechende (versionierte!) Verzeichnis. Verzeichnisse mit besonderen Eigenschaften (Properties - dazu später mehr) sind Module: Zu einem Modul kann man mehrere Unterverzeichnisse aus mehreren Repositories zusammenfassen. Das Versioning vollzieht sich immer bezogen auf ein Repository - deswegen kann es bei vielen Projekten sinnvoll sein, auch mehrere Repositorys anzulegen. Als Trunk bezeichnet man den Hauptbaum eines Projekts und als Branch einen Nebenzweig. Ein Branch ist bei subversion eine Kopie des Trunks. Es handelt sich dabei nicht um eine echte, verdoppelnde Kopie, sondern um eine Art Hardlink: Trunk und Branch sind nur einmal in der Berkley-DB vorhanden, werden aber ab der Abzweigung (seit dem Branch) getrennt bearbeitet und verwaltet. Natürlich kann ein Branch (oder mehrere) wieder zurück in einen Trunk migriert werden: Mittels eines Merges fügt subversion Änderungen verschiedener Branches über einen bestimmten Revisionsraum zusammen. Ein Revisionsraum kann eine Angabe wie von Revision 352 - Revision 763 oder die Änderungen seit April 2002 sein - subversion akzeptiert genau wie CVS bei vielen Befehlen sehr flexible Datums- und Versionsangaben. Ist man mit den Änderungen und Migrationen zufrieden und hat eine lauffähige Version, kann man einen Tag setzen: Damit wird ein bestimmter Zustand eines Projekts markiert. Der Tag ist im Grunde nur das Erzeugen eines Branches, mit dem man unterschiedliche Revisionen von Dateien und Verzeichnissen als zu einem Tag gehörig deklariert: Man kann damit wie über ein Alias arbeiten, z.B. release-0.7-stable auschecken oder als Archiv packen.Erste Schritte: subversion als Anwender
Wenn alles installiert ist, experimentiert man am Besten lokal mit dem ersten Archiv: Mit svnadmin create SVN ist das erste Repository erstellt. Wirft man einen Blick hinein, finden sich ein paar ungewohnte Unterverzeichnisse: README conf/ dav/ db/ format hooks/ locks/ - in /db findet sich in Form von Berkeley-DB Dateien das Repository. In diesen Verzeichnissen editiert normalerweise nur der Administrator des Repositorys; der Anwender hat - genau wie bei CVS - nach dem Auschecken eines Projekts oder Moduls sein eigenes .svn/ in jedem Verzeichnis der lokalen Arbeitskopie. Subversions Befehlssyntax ist allgemeinsvn command options target
svn import file:////home/user/SVN /home/user/TheProject MyProject
svn import http://subversionserver.de/SVN/ /home/user/TheProject MyProject an.
svn checkout file:///home/user/SVN/MyProject MyCopy
svn checkout http://subversionserver.de/SVN/MyProject MyCopy
Erst vergewissern - dann ändern
Bevor man Änderungen einpflegt, zeigen svn status und svn diff Änderungswünsche an, ohne sie durchzuführen. svn diff, svn status und svn revert können dank des Caching-Systems von subversion auch ohne Netzwerkverbindung arbeiten: Die betreffenden Änderungen werden in den Metadaten in ~/.svn vorgehalten, bevor alles an den Server beim svn commit gesendet wird. Diese Metadaten sind XML-Files, in denen die Eigenschaften, Dateilisten, Namen, Autor, Checksumme, Timestamps und vieles mehr festgehalten werden. Wer neugierig ist, kann die Metadaten in ~/.svn im Klartext angucken. Svn status zeigt an, welche Änderungen der Datei anstehen: ein --verbose (-v) ergänzt die Revisionsnummer, wer die Änderungen gemacht hat und in welcher Revision die letzte Änderung stattfand. Kombiniert man --verbose noch mit --show-updates (-u) markiert subversion die Dateien, die beim Update bearbeitet werden. Für -u braucht man wieder eine Verbindung zum Repository: -u vergleicht die Arbeitskopie mit der Repository-Version der Dateien. Ein typischer Output sieht dann wie folgt aus:4 4 banshee .M * 6 6 banshee GrammatikM 8 8 banshee LyrikM 4 2 someone adjektiv.txtHead revision: 9
svn diff -r3:4 http://subversionserver.de/SVN/source.c > mypatch
svn cat -r7 foobar.c > foobar.c
Mit Branches und Mergers arbeiten
Um in einem Projekt über mehrere Monate hinweg mit unstabilen Sourcen arbeiten zu können oder größere Projektumstellungen zu bewältigen, braucht man früher oder später einen Branch (Zweig) des Hauptprojekts. Mit subversion erledigt man das mitsvn copy http://subversionserver.de/SVN/trunks/projectA \ http://subversionserver.de/SVN/branches/projectA-branch
svn checkout http://subversionserver.de/SVN/branches/projectA-branch MyBranch
Metadaten und Eigenschaften
Die oben kurz erwähnten Metadaten in ~/.svn in jeder Arbeitskopie können übrigens vom Benutzer verwendet werden und unterliegen auch der Versionskontrolle - deswegen hat svn status zwei Spalten. Verschiedene Kommandos wie svn propset, propedit, prodel, proplist und propget können die Eigenschaften (Properties) bezogen auf jede einzelne Datei bearbeiten. Die Eigenschaften sind dabei frei wählbar und werden so vergeben:svn propset Autor "Susanne Schmidt" lyrik.cgi
Als Administrator eines Projekts
Die Administration von subversion unterscheidet sich natürlich grundlegend vom Gebrauch von subversion als Benutzer. Als Administrator kann man unterschiedlichste Anweisungen an subversion übergeben, die sich auf die Arbeit von Benutzern auswirken. subversion versteht Anweisungen - so genannte Hooks die vor einem Commit, beim Start eines Commits und nach einem Commit ausgeführt werden können. Das typische post-commit-Skript ist die Benachrichtung einer Mailingliste über Änderungen einer Datei inklusive ihrer commit-Messages. Ein klassisches pre-commit-Skript ist beispielsweise die Kontrolle über den Einrückungsstil der Sourcen oder die Verpflichtung, keine Funktion ohne Kommentar einzuchecken und dergleichen mehr. Natürlich kann man hier auch Tools wie indent verwenden und Einrückungen automatisch vornehmen lassen. Mit start-commit-Hooks kann man sogar benutzerspezifische Aktionen durchführen - je nachdem, wer gerade einen Commit ausführt. Ein Hook wird in einem Template-File (start-commit.tmpl) eingetragen, dass subversion in /hooks des Repository erwartet; das auszuführende Skript legt man mit passenden Rechten dazu. Im Source-Paket von subversion liegen mehrere fertige Hook-Skripte griffbereit. Als Administrator sind außerdem noch Befehle wie svnadmin dump, um ein Backup im dump-Format anzulegen oder svnadmin lock, um einzelne Teile des Repositorys gegen Schreibzugriff zu schützen, wichtig. Wer also subversion benutzen will, findet sich als CVS-User leicht in die Syntax ein; die Installation klappt problemlos und viele Features funktionieren bereits und der Gebrauch ist wirklich sehr einfach. Wer allerdings eine fertige Release erwartet, wird sich doch noch einige Zeit gedulden müssen - solange sollte man das vielversprechende Projekt nicht aus den Augen verlieren! Links- Sourcen und Handbuch zu subversion: subversion.tigris.org/
- Apache 2: httpd.apache.org/
- Neon-Bibliothek und Informationen über WebDAV: www.webdav.org/neon/
- Berkeley-DB Version 4.0.14: www.sleepycat.com//update/snapshot/db-4.0.14.tar.gz
- Expat von James Clark: expat.sourceforge.net/




