- Subversion (Software)
-
Subversion Entwickler: CollabNet Aktuelle Version: 1.6.1
(9. April 2009)Betriebssystem: AIX, GNU/Linux, Windows, Mac OS X, *BSD, Solaris, OS/400 Programmiersprache: C Kategorie: Versionsverwaltung Lizenz: Subversion License (ähnlich Apache/BSD) Deutschsprachig: Nach Installation eines Sprachpaketes subversion.tigris.org Subversion (SVN) ist eine Open-Source-Software zur Versionsverwaltung von Dateien und Verzeichnissen.
Die Versionierung erfolgt in einem zentralen Projektarchiv (engl. repository) in Form einer einfachen Revisionszählung. Wenn Änderungen an Inhalten verteilt auf den Computern der Bearbeiter ausgeführt werden, werden zwischen dem Projektarchiv und einem Arbeitsplatz jeweils nur die Unterschiede zu bereits vorhandenen Ständen übertragen; anfangs das gesamte Projekt, später nur Änderungen.
Inhaltsverzeichnis
Allgemeines
Subversion wird als Freie Software unter einer Lizenz im Stil der Apache-Lizenz veröffentlicht.
Die Benennung „Subversion“ setzt sich aus den Worten Sub und Version zusammen und kann so als Unterversion, früherer Version verstanden werden. Eine andere Interpretation führt den Namen auf den politisch-soziologischen Begriff Subversion (etwa: Umsturz) zurück. Allerdings ist von den Entwicklern nicht dokumentiert worden, ob dieses Wortspiel beabsichtigt ist.
Subversion wurde als moderne Ablösung für das mit vielen Schwächen behaftete, in Entwicklerkreisen aber weiterhin sehr verbreitete Programm CVS entwickelt. Deshalb ist es in der Bedienung sehr ähnlich gehalten, behebt aber einige Schwächen von CVS. So ist es mit Subversion z. B. möglich, Dateien oder Verzeichnisse zu verschieben oder umzubenennen, ohne die Versionsgeschichte zu verlieren. Dies wird im Abschnitt Unterschiede zu CVS vertieft.
Mit cvs2svn existiert ein Konverter, mit dem ein CVS-Repository zu Subversion konvertiert werden kann. Auch für die Migration von anderen Versionsverwaltungs-Systemen (etwa PVCS, Visual Source Safe, ClearCase, MKS, Perforce, StarTeam, …) sind verschiedene kostenfreie Import-Werkzeuge erhältlich.
Geschichte
Subversion wird seit Anfang 2000 bei CollabNet entwickelt und erreichte am 23. Februar 2004 die stabile Version 1.0. Am 29. September 2004 erschien Version 1.1, deren größte Neuerung war, dass Projektarchive (Repositories) nicht mehr nur in einer Berkeley-Datenbank verwaltet werden können, sondern dass dazu auch direkt das Dateisystem benutzt werden kann. Außerdem wurden internationalisierte Programmausgaben ermöglicht. Die am 23. Mai 2005 erschienene Version 1.2 unterstützt nun auch optionale Bearbeitungssperren für Dateien, was teilweise für binäre Dateien von Vorteil sein kann. Seit dem 1. Januar 2006 existiert die Version 1.3, die in den Bereichen Server-Logging, Autorisierung, Programmiersprachen-Anbindungen, Kommando-Optionen und Leistung („Performance“) Verbesserungen bietet. Am 10. September 2006 wurde Version 1.4 veröffentlicht, sie bringt das Programm svnsync mit, welches das Spiegeln von Projektarchiven (Repositories) ermöglicht.
Die am 19. Juni 2008 veröffentlichte Version 1.5 erweiterte Subversion um das sogenannte Merge-Tracking, dem dokumentierten Zusammenführen verschiedener Teilbäume. Version 1.6 wurde am 20. März 2009 veröffentlicht und erweitert das Merge-Tracking sowie Sicherheitsfunktionen.
Unterschiede zu CVS
Der entscheidende Unterschied zwischen CVS und SVN liegt in der Rangfolge von örtlicher (L) und zeitlicher (T) Kennzeichnung der Inhalte eines Projektarchivs (P): während in CVS primär örtlich, sekundär zeitlich adressiert wird (P:L.T), werden in SVN die Koordinaten umgekehrt (P:T.L) geschrieben. SVN bildet die erfahrungsgemäße Realität von Veränderungen damit anschaulicher nach: Jede Veränderung benötigt Zeit, und ihre Endpunkte sind das Vorher (Revision vor Änderung) und das Nachher (Revision nach der Änderung). SVN versioniert oder revisioniert also grundsätzlich das gesamte Projektarchiv und damit jeweils die gesamte Verzeichnisstruktur, während CVS auf der unabhängigen Versionierung jedes einzelnen Inhalts beruht.
Das Versionsschema von Subversion bezieht sich nicht mehr auf einzelne Dateien, sondern jeweils auf das ganze Projektarchiv, mit jeder Änderung bekommt es eine neue „Revisionsnummer“ zugeordnet. Somit kann man einfacher – und im Gegensatz zu CVS konsistent – eine exakte Version beschreiben (z. B. „Revision 2841“ statt „Version vom 23. März 2004 20:56:31 UTC“). Die Revisionsnummer einer Datei entspricht dabei der Revisionsnummer des Projektarchivs, als sie das letzte Mal geändert wurde, die Revisionsnummer eines Verzeichnisses entspricht der höchsten Revisionsnummer der enthaltenen Dateien und Verzeichnisse. Die Abfolge der Revisionsnummern einer einzelnen Datei kann also durchaus lückenhaft sein, wenn die Datei nicht bei jeder Änderung (Commit) am Repository geändert wurde. Beispielsweise könnte eine Datei bei der Revision 25 zum Projektarchiv hinzugefügt worden sein und jeweils einmal in der Revision 48 und der Revision 52 verändert worden sein. Beim Abrufen (checkout) einer Datei wird die größte Revisionsnummer abgerufen, die kleiner oder gleich der angeforderten ist. Wird in dem Beispiel die Revision 52 angefordert, so wird die Revision 52 der Datei abgerufen; wird hingegen die Revision 51 angefordert, liefert Subversion die Inhalte von Revision 48.
Subversion speichert Client-seitig beim Erstellen einer lokalen Kopie (checkout), beim Aktualisieren (update) und Übertragen (commit) in einem gesonderten Verzeichnis (
.svn
) eine zweite Kopie jeder Datei. Dadurch verdoppelt sich der Speicherbedarf einer Arbeitskopie, allerdings bietet dies bei entfernten Projektarchiven auch einige Vorteile. So können einige Aktionen, wie Anzeige der lokalen Änderungen, ganz ohne Netzwerkzugriff erfolgen, und Subversion muss beim Übertragen nur die geänderten Teile einer Datei übertragen, während CVS die Änderungen Server-seitig berechnet und somit jeweils die gesamte Datei übertragen muss. Auch ist es möglich, jederzeit die Änderungen einer Datei gegenüber ihrer Basisversion zu ermitteln oder zurückzunehmen, ohne das Projektarchiv zu konsultieren.Die Übertragung der lokalen Änderungen (commits) geschieht dabei in Subversion atomar, das heißt, eine Änderung - auch mehrerer Dateien - wird entweder ganz oder gar nicht ins Repository gespeichert. Verbindungsabbrüche und mehrere gleichzeitige Zugriffe können somit nicht zu inkonsistenten Zuständen führen.
Kopien
Subversion ist in der Lage, Kopien von Dateien so zu verwalten, dass die Kopien dieselbe Geschichte teilen. Dieser Umstand ist besonders dann nützlich, wenn Änderungen an einer der Dateien in die andere portiert werden sollen. Zur Erstellung einer Kopie wird auch keine Duplizierung der Daten vorgenommen, sondern eine datenbankinterne Verknüpfung angelegt, die im weiteren Verlauf genauso weiterverwendet werden kann wie das Original. Von dieser Technik wird häufig als „billige Kopie“[1] gesprochen. Kopien sind insbesondere bei der Umbenennung und der Verschiebung von Dateien interessant. Subversion realisiert dies zwar wie CVS, indem es eine Kopie anlegt und das Original als gelöscht markiert, allerdings kommt es nicht wie in CVS zu einem Bruch im Versionsverlauf. Eine native Unterstützung für Verschiebung/Umbenennung ist auf der Entwicklerseite als mittelfristiges Ziel genannt.[2]
Tag- und Branchkonzept
Neben dem geänderten Datenbank-Modell sticht das zu CVS völlig unterschiedliche Konzept im Bereich der Benennung einer Dateiversion (sogenanntes tagging) und der Verzweigung in Varianten (branching) hervor. Während die Benennung von Versionen und Verzweigungen in CVS eine klare semantische Bedeutung haben, kennt Subversion nur das Konzept der „billigen Kopie“, die je nach Nutzungsart „Tag-“ oder „Branch-Charakter“ haben kann. Jede Kopie in Subversion ist demnach automatisch eine Variante dieser Datei oder des Verzeichnisses. Namentliche Kennzeichnungen entstehen in Subversion durch eine Kopie, an der später keine Änderungen mehr vorgenommen werden. Wegen des Fehlens einer Tag- oder Branch-Semantik obliegt die Strukturierung und Verwaltung von Kennzeichnungen und Verzweigungen dem Benutzer und Administrator. Dabei hat sich bewährt, für Projekte die Basisverzeichnisse trunk (engl. „Stamm“), branches (engl. „Verzweigungen“) und tags (engl. „Markierungen“) anzulegen. trunk enthält dabei die Hauptentwicklungslinie des Projekts, in branches werden weitere Unterverzeichnisse mit alternativen Entwicklungspfaden verwaltet, und in tags eine Kopie von trunk oder einem der branches als Unterverzeichnis angelegt. Zur besseren Übersicht werden je nach Projektanforderungen tags und branches noch in weitere Unterverzeichnisse unterteilt. Als head bezeichnet man die neueste Version („top revision“) innerhalb einer Verzweigung.
Durch das Fehlen einer aufgezwungenen Semantik für Kennzeichnungen ist bei gehobenen Ansprüchen an das Versionskontrollsystem die Angabe der Revisionsnummer als Referenz, beispielsweise bei der Verwaltung von Programmfehlern (sogenanntes Bug-Tracking) oder in der Dokumentation, unabdingbar. Die Verwendung serverseitiger Scripte kann steuern, ob, wie und von wem erstellte Kopien modifiziert werden können. Darüber hinaus ist die Erzeugung von Kennzeichnungen und Verzweigungen in Subversion deutlich schneller (d. h. benötigt weniger Rechenzeit) als in CVS.
Da Dateien in Subversion auch versionskontrolliert umbenannt werden können, kann die Projektstruktur jederzeit gestiegenen oder gesunkenen Anforderungen angepasst werden.
Sonstiges
Subversion kann auch Verzeichnisse und Metadaten verwalten. Insbesondere können Verzeichnisse auch als gelöscht markiert werden. Dies ist mit CVS nicht möglich, hier können nur optional leere Verzeichnisse gelöscht werden, sie können nicht ohne Verlust der Historie aller enthaltenen Dateien aus dem Repository gelöscht werden. Subversion bietet einen verbesserten Umgang mit Binärdaten. Es erkennt solche Dateien (beispielsweise Bilder oder Audiodateien) weitgehend automatisch, und es werden (wie bei Textdateien) nur die Differenzen zwischen den geänderten Versionen gespeichert. In CVS geht das umständlicher über Eintrag der Endungen von binären Dateien in
cvswrapper
, verschiedene Versionen von Dateien dieser Typen müssen aber immer vollständig gespeichert werden.Wie CVS bietet Subversion den Netzwerkzugriff über einen eigenen Server, auf den mit SSH auch verschlüsselt zugegriffen werden kann. Zusätzlich hierzu und der Speicherung im lokalen Dateisystem existiert auch ein Modul für den Apache 2-Webserver, mit dem die Daten auch mit der HTTP/HTTPS-Erweiterung WebDAV übertragen werden können. Somit kann die aktuelle Revision einer Datei auch mit einem gewöhnlichen Webbrowser abgerufen werden.
Einmal eingefügte (checked in) Dateien lassen sich nur noch mit großem Aufwand, teilweise sogar mit der Gefahr, das Repository zu zerstören, vollständig (mitsamt Versionshistorie) entfernen. [3] Für die Zukunft ist geplant, das Kommando
svnadmin obliterate
zu implementieren, welches ein sicheres und rückstandfreies Löschen ermöglichen soll [4], was allerdings seit inzwischen über einem halben Jahrzehnt nicht verwirklicht wurde.Subversion verwaltet das gesamte Repository in einer Datenbank, deren Dateien nicht die Struktur des Repository-Inhalts widerspiegeln. Die Integrität der Datenbank lässt sich so verzeichnisübergreifend überprüfen. Es stehen dabei aktuell zwei Backends zur Verfügung. Das in der Version 1.1 hinzugefügte
fsfs
-Backend verwendet ein eigenes Format. Das andere Backend verwendet das Berkeley-Datenbanksystem, dies hat jedoch den Nachteil, dass die Daten einerseits dessen binären Inkompatibilitäten abhängig von der verwendeten Version unterliegen, und andererseits den damit eingebrachten Stabilitätsproblemen. Dies kann zur Folge haben, dass ein mit einer älteren Version erstelltes Repository auf die neue Version angepasst werden muss. Zudem ist der Zugriff über NFS und Windows-Netzwerkfreigaben dann nicht möglich.Im Gegensatz zu CVS definiert Subversion die Zeichenkodierung, welche für Dateinamen und Log-Messages im Repository benutzt wird. Damit können beispielsweise auch Dateien mit Umlauten im Namen auf Systemen mit verschiedenen Zeichen-Codierungen (beispielsweise CP1252 (deutschsprachiges Windows), UTF-8 (Linux)) benutzt werden, während dies bei CVS nicht plattformunabhängig funktioniert, da die CVS-Client-Server-Protokoll-Definition dies nicht festlegt.
Die aktuelle Subversion-Version hat lediglich Probleme auf Mac OS X, da dessen Dateisystem z. B. Umlaute als zwei Zeichen speichert (etwa „a“ + „¨“[5]), während Windows und Linux nur ein Zeichen benutzen (etwa „ä“). Man kann die unter Mac OS X hinzugefügten Dateien zwar unter Windows abrufen, aber die Umlaute bestehen intern dann auch aus zwei Zeichen, werden aber wie „normale“ Umlaute beispielsweise im Explorer angezeigt. Da man trotzdem Dateien mit „normalen“ Ein-Zeichen-Umlauten anlegen kann, ist es so möglich, zwei gleich aussehende, aber intern vom Namen her unterschiedliche Dateien in demselben Verzeichnis unter Windows zu haben. Ein vergleichbares Problem tritt bei der Verwendung innerhalb von Unix-Windows-Projektumgebungen auf. So ist es möglich, unter Unix zwei Dateien anzulegen, welche sich nur in der Groß/Kleinschreibung unterscheiden. Dies wird von Windows nicht unterschieden und führt somit dazu, dass eine der beiden Dateien immer die andere überschreibt. Gelöst werden kann dieses Problem nur durch Änderung der Benennung auf dem Server.
Abhängigkeiten von Subversion
Für eine Installation der Basisfunktionalität muss seit Version 1.1.0 nur die Apache Portable Runtime-Bibliothek vorhanden sein. Zuvor war auch noch eine Berkeley-DB in einer Version von 4.0 oder höher notwendig, was jetzt aber hinfällig ist, da das Repository mit Hilfe des FSFS-Backend optional auch direkt im Dateisystem gespeichert werden kann.
Apache 2 und Neon sind für die WebDAV-Nutzung erforderlich, Python 2.x für einige mitgelieferte Test-Skripte, eine SSL-Implementierung, wenn man WebDAV verschlüsseln will. Seit Version 1.4 kann alternativ auch Serf anstatt neon für WebDAV verwendet werden.
Die Einrichtung eines Repositorys besteht – wie bei CVS – aus dem Aufruf eines Befehls. Bei lokalem Zugriff kann man nun sofort loslegen. Will man Subversion als Server konfigurieren, hängt der Aufwand stark von der gewählten Methode ab, ist jedoch ähnlich im Vergleich zu anderen Systemen, wie beispielsweise CVS.
Der Standard-Subversion-Port ist 3690.
Grafische Benutzeroberflächen
Es gibt einige ausgereifte grafische Benutzeroberflächen (GUI) für Subversion. Sie machen es den Benutzern besonders leicht, auf ein Subversion-Repository zuzugreifen. Hier einige Anwendungen:
- Cornerstone: Mac OS X, proprietär
- KDEsvn: Linux (KDE), Open-Source
- RapidSVN: Linux (Gnome), Open-Source
- SmartSVN: Mac OS X, Windows, Linux, OS/2, Freeware
- Subcommander: Mac OS X, Windows & Linux, Open-Source
- svnX: Mac OS X, Open-Source
- TortoiseSVN: Windows, Open-Source
- Versions: Mac OS X, proprietär
- ZigVersion: Mac OS X, Freeware
Integriert in Entwicklungsumgebungen:
- AnkhSVN für Microsoft Visual Studio
- Dreamweaver ab Version CS4 von Adobe Systems
- Subclipse und Subversive für Eclipse
Weiterhin sind Plugins für NetBeans, KDevelop, Code::Blocks, Vim, TYPO3 und ASCET verfügbar. Die globale Administration (Benutzerrechte, Protokolle, …) erfolgt jedoch weiterhin über spezielle SVN-eigene Konfigurationsdateien.
Um ein Subversion-Repository lediglich zu betrachten, bieten viele Open-Source-Projekte einen Link auf ihren Webdienst an. Dieser präsentiert in übersichtlicher Form Inhalte von Dateien, Verzeichnissen und Logbüchern, auch Datei-Vergleiche sind möglich.
Literatur
- Tobias Wassermann: Versionsmanagement mit Subversion, mitp-Verlag, 1. Auflage Oktober 2006, ISBN 978-3-8266-1662-4.
- Frank Budzuhn: Subversion, Galileo Computing, 2. aktualisierte und erweiterte Auflage 2007, ISBN 978-3-89842-879-8.
Einzelnachweise
- ↑ Erläuterung der Bubble-Up- Methode als Grundlage „billiger Kopien“ in SVN
- ↑ Subversion-Bugtracker: Issue 898
- ↑ Subversion-Bugtracker: Issue 516, 4. Oktober 2001
- ↑ Subversion FAQ: How do I completely remove a file from the repository's history?, 3. August 2006
- ↑ genauer: LATIN SMALL LETTER A + COMBINING DIAERESIS The Unicode Standard 5.0, Chapter 3.6 Combination
Weblinks
Wikimedia Foundation.