mini|Zentrale Verwaltung eines Repositoriums mit Hilfe von Subversion.

Apache Subversion (SVN) ist eine freie Software zur zentralen Versionsverwaltung von Dateien und Verzeichnissen.

Die Versionierung erfolgt in einem zentralen Repositorium bzw. 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.

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ühere Version verstanden werden. Der Name wurde von Jim Blandy geprägt, der auch das initiale Design des Subversion-Speichers definierte. Er verstand die Software als eine Weiterentwicklung von CVS, wobei als Reaktion auf weit verbreitete Kritik an CVS insbesondere die Handhabung von Versionshistorien geändert wurde.Subversion Buch Subversion’s History So ist es mit Subversion – im Gegensatz zu CVS – z. B. möglich, Dateien oder Verzeichnisse zu verschieben oder umzubenennen, ohne die Versionsgeschichte zu verlieren. Details finden sich im Abschnitt Unterschiede zu CVS. In der Bedienung der Kommandozeilenversion ist es dagegen sehr ähnlich gehalten.

Mit cvs2svn gibt es einen Konverter, mit dem ein CVS-Repositorium 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 wurde seit Anfang 2000 bei CollabNet entwickelt.

Am 4. November 2009 gaben ehemaliger und neuer Hoster in einer gemeinsamen Presseerklärung bekannt, dass das Projekt auf Entschluss von CollabNet zur Apache Software Foundation wechseln werde. Am 7. November 2009 startete Apache Subversion im Apache Incubator, seit 17. Februar 2010 ist Apache Subversion ein Top-Level-Apache-Projekt.

Veröffentlichungen Version Erscheinungsdatum Bemerkungen 5. Juni 2000 CVS-Repositorium zur gemeinsamen Entwicklung eingerichtet. 15. Februar 2002 Große Fortschritte beim Repositoriums-Konverter cvs2svn, Kommando svn switch eingeführt, Quelltext reorganisiert und aufgeräumt, Build-System erneuert. 23. Juli 2002 Erste Alpha-Version veröffentlicht. 19. Dezember 2003 Erste Beta-Version veröffentlicht. 23. Februar 2004 Version 1.0 fertiggestellt. 29. September 2004 Projektarchive (Repositorien) können nicht mehr nur in einer Berkeley-Datenbank verwaltet werden, sondern auch direkt im Dateisystem. Internationalisierte Programmausgaben. 21. Mai 2005 Bearbeitungssperren für Dateien, was für binäre Dateien von Vorteil sein kann. 30. Dezember 2005 Verbesserungen in den Bereichen Server-Logging, Autorisierung, Programmiersprachen-Anbindungen, Kommando-Optionen und Performance. 10. September 2006 Neues Programm svnsync, welches das Spiegeln von Projektarchiven (Repositorien) ermöglicht. 19. Juni 2008 Neue Funktionalität Merge-Tracking, das dokumentierte Zusammenführen verschiedener Teilbäume. 20. März 2009 Verbesserungen des Merge-Tracking und der Sicherheitsfunktionen. 11. Oktober 2011 Änderung der Metadatenverwaltung: Anstatt Metadaten in .svn-Ordnern in jedem Unterverzeichnis zu speichern, werden diese jetzt zentral in einem einzigen .svn-Ordner im Hauptverzeichnis der Arbeitskopie in einer SQLite-Datenbank gespeichert. 18. Juni 2013 Lokales (Working copy) Verschieben/Umbenennen von Dateien wird transparent unterstützt, Vereinfachungen des Re-Integrierens von Teilbäumen, vererbte Eigenschaften und Einstellungen direkt im Projektarchiv. 7. Juli 2017 Kleinere Fehlerbehebungen, unter anderem für mögliche SHA1-Kollisionen 10. August 2017 Sicherheitsupdate um Client-seitige Ausführung von beliebigem Code zu verhindern (CVE-2017-9800). 5. August 2015 Neues, verbessertes FSFS-Dateiformat Version 7, neues Tool svnfsfs, experimentelles FSX-Dateiformat, neues svn-Unterkommando auth, Server-seitige Performance-Verbesserungen, Erweiterung der Tools svnadmin und svnbench, 3-Wege-Konflikt- und diff3-Verbesserungen, vorausschauendes blame. 6. Juli 2017 Speicherbedarf bei Verwendung großer Mengen an Merge-Metadaten reduziert, einzelne Fehlermeldungen verbessert, Konsistenzprüfung nun unabhängig von Hash-Algorithmen um beispielsweise SHA1-Kollisionen zu entgehen, weitere kleine Fehlerbehebungen. 11. Januar 2019 Sicherheitsupdate um Client-seitige Ausführung von beliebigem Code zu verhindern (CVE-2017-9800). 11. Januar 2019 Improved path-based authz, new interactive conflict resolver, LZ4 compression, FSFS format 8, shelving. 12. April 2022 Letzte Version des 1.10.x-Astes mit Langzeitunterstützung (LTS), mit Erscheinen des 1.14.x-LTS-Asts wurde dieser Ast zum aktuellen „Old-Stable“. Die Unterstützung endete am 24. September 2023. Anwender- und entwicklungsseitige Verbesserungen siehe Änderungshistorie. Enthält weiterhin Patches gegen CVE-2021-28544 SVN authz protected copyfrom paths regression und CVE-2022-24070 Subversion's mod_dav_svn is vulnerable to memory corruption, siehe Beschreibung in Release Announcement for Apache Subversion 1.10.8 sowie dort verlinkte Schwachstellenmeldungen. 11. Januar 2019 Improved shelving, checkpointing, improved tree conflict resolution. 24. April 2019 Improved shelving, improved checkpointing, improvements to the interactive conflict resolver. 30. November 2019 27. Mai 2020 12. April 2022 Vorherige stabile Version des 1.14.x-Astes mit Langzeitunterstützung (LTS). Anwender- und entwicklungsseitige Verbesserungen siehe Änderungshistorie.

Enthält weiterhin Patches gegen CVE-2021-28544 SVN authz protected copyfrom paths regression und CVE-2022-24070 Subversion's mod_dav_svn is vulnerable to memory corruption, siehe Beschreibung in Release Announcement for Apache Subversion 1.14.2 sowie dort verlinkte Schwachstellenmeldungen.28. Dezember 2023 8. Oktober 2024 8. Dezember 2024 Aktuelle stabile Version des 1.14.x-Astes mit Langzeitunterstützung (LTS).2025 Nächste geplante stabile Version des 1.14.x-Astes mit Langzeitunterstützung (LTS). 20XX Zukünftige stabile Hauptversion (neuer 1.15.x-Ast). Geplante Client-seitige Verbesserungen: Gleichzeitige Unterstützung mehrerer Arbeitskopieformate in einem Projekt (ab 1.8 bis 1.15). Geschwindigkeitssteigerung.

Besonderheiten Versionsschema Das Versionsschema von Subversion bezieht sich nicht auf einzelne Dateien, sondern auf das ganze Projektarchiv. Dieses bekommt bei jeder Änderung eine neue „Revisionsnummer“ zugeordnet. Somit kann einfach und konsistent eine exakte Version des Projektarchivs beschrieben werden (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 zum Zeitpunkt der letzten Änderung der Datei. Die Revisionsnummer eines Verzeichnisses entspricht der höchsten Revisionsnummer aller 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 Repositorium geändert wurde. Beispielsweise könnte eine Datei bei der Revision 40 zum Projektarchiv hinzugefügt 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.

Änderungsverfolgung Subversion speichert Client-seitig bei jedem Checkout, Update und Commit einer Datei eine Kopie, welche im .svn-Verzeichnis abgelegt wird. 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. Auch ist es möglich, jederzeit die Änderungen einer Datei gegenüber ihrer Basisversion zu ermitteln oder zurückzunehmen, ohne das Projektarchiv zu konsultieren.

Export-Kommando Da die im .svn-Ordner enthaltenen Metadaten etwa auf einem Produktivsystem nicht erwünscht sind, gibt es in Subversion das export-Kommando, welches die Dateien ohne die Metadaten des .svn-Ordners ins Dateisystem schreibt. Dies unterscheidet einen Export von einem Checkout.

Atomare Commits Commits geschehen in Subversion atomar, das heißt, eine Änderung – auch mehrerer Dateien – wird entweder ganz oder gar nicht ins Repositorium gespeichert. Verbindungsabbrüche und mehrere gleichzeitige Zugriffe können somit nicht zu inkonsistenten Zuständen führen.

„Billige Kopien“ Subversion ist in der Lage, Kopien von Dateien so zu verwalten, dass den Kopien derselbe Bearbeitungsverlauf gemeinsam ist. Dieser Umstand ist besonders dann nützlich, wenn Änderungen an einer der Dateien in die andere portiert werden sollen. Zur Erstellung einer Kopie werden die Dateien auch nicht dupliziert, sondern es wird eine Datenbank-interne Verknüpfung angelegt, die im weiteren Verlauf genauso weiterverwendet werden kann wie das Original. Von dieser Technik wird häufig als billige KopieErläuterung der Bubble-Up-Methode als Grundlage „billiger Kopien“ in SVN (englisch) gesprochen.

Umbenennungs- und Verschiebungskonzept Das Kopie-Konzept wird bei der Umbenennung und Verschiebung von Dateien eingesetzt: Subversion realisiert diese, indem es eine Kopie anlegt und das Original als gelöscht markiert, dabei kommt es zu keinem Bruch im Versionsverlauf.

Eine native Unterstützung für Verschiebung und Umbenennung ist auf der Entwicklerseite als mittelfristiges Ziel genannt.Subversion-Bugtracker:

Tag- und Branchkonzept Neben dem geänderten Datenbank-Modell sticht das zu anderen Versionsverwaltungssystemen völlig unterschiedliche Konzept im Bereich der Benennung von Dateiversionen (sogenanntes Tagging) und der Verzweigung in Varianten (sogenanntes Branching) hervor. Während die Benennung von Tags und Branches in den meisten anderen Versionsverwaltungssystemen wie Git, Mercurial oder auch CVS eine klare semantische Bedeutung hat, 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, die später nicht mehr verändert werden sollte. Wegen des Fehlens einer Tag- oder Branch-Semantik obliegt die Strukturierung und Verwaltung von Kennzeichnungen und Verzweigungen dem Benutzer und Administrator. Dabei hat es sich bewährt, für Projekte die Basisverzeichnisse trunk (dt. „Stamm“), branches (dt. „Verzweigungen“) und tags (dt. „Markierungen“) anzulegen. Das Verzeichnis 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 (engl. „top revision“) innerhalb einer Verzweigung.

650px|mini|zentriert|Visualisierung eines Subversion-Projektes