Subversion bei der Arbeit

Arbeitskopien

Sie haben bereits über Arbeitskopien gelesen; nun werden wir zeigen, wie Subversion diese erstellt und benutzt.

Eine Subversion-Arbeitskopie ist eine ganz normale Ordnerstruktur auf einem lokalen Dateisystem, welches eine Anzahl von Dateien enthält. Sie können diese Dateien ändern wie Sie wollen, und falls dies Quellcode-Dateien sind, können Sie diese kompilieren wie sonst auch. Ihre Arbeitskopie ist Ihr eigenes privates Arbeitsfeld: Subversion wird nie Änderungen von anderen einfügen oder Ihre Änderungen anderen zur Verfügung stellen, ohne dass Sie Subversion explizit dazu auffordern.

Nachdem Sie einige Änderungen an den Dateien in Ihrer Arbeitskopie vorgenommen haben und Sie überprüft haben, dass diese immer noch korrekt funktionieren (z. B. ohne Fehler kompilierbar sind), stellt Ihnen Subversion Befehle zur Verfügung, um Ihre Änderungen zu publizieren (durch Speichern im zentralen Projektarchiv), d. h., anderen zur Verfügung zu stellen. Falls andere Benutzer ihre Änderungen veröffentlicht haben, stellt Subversion Befehle zur Verfügung, mit denen Sie diese Änderungen in Ihre Arbeitskopie einfügen können (durch Lesen aus dem zentralen Projektarchiv).

Eine Arbeitskopie enthält immer auch zusätzliche Dateien, erstellt und verwaltet von Subversion, um diese Befehle ausführen zu können. Genauer gesagt enthält jeder Ordner in Ihrer Arbeitskopie einen Unterordner mit Namen .svn, auch bekannt als der Administrative Ordner der Arbeitskopie. Die Dateien in jedem administrativen Ordner helfen Subversion dabei zu erkennen, welche Dateien Sie verändert haben und welche Dateien sich im Projektarchiv durch andere Benutzer geändert haben.

Ein typisches Subversion Projektarchiv enthält oft Dateien (oder Quellcode) von mehreren Projekten; normalerweise ist jedes Projekt ein Unterordner im Dateibaum. In einem solchen Umfeld enthält eine Arbeitskopie normalerweise nur einen solchen Unterordner des Projektarchivs.

Als Beispiel nehmen Sie an, dass Sie ein Projektarchiv haben, das zwei Softwareprojekte enthält.

Abbildung 2.6. Das Dateisystem des Projektarchivs

Das Dateisystem des Projektarchivs

In anderen Worten, das Hauptverzeichnis des Projektarchivs hat zwei Unterordner: paint und calc

Um eine Arbeitskopie zu erhalten, müssen Sie einen dieser Unterordner aus dem Projektarchiv Auschecken. Das klingt so, als würden dadurch Ressourcen gesperrt oder reserviert, aber dem ist nicht so. Es wird lediglich eine private Kopie des Projekts für Sie erzeugt.

Angenommen, Sie machen Änderungen an der Datei button.c. Da der .svn Ordner den Originalinhalt und das Änderungsdatum gespeichert hat, kann Subversion feststellen, dass Sie diese Datei geändert haben. Jedoch wird Subversion diese Änderungen erst veröffentlichen, wenn Sie Subversion dazu explizit auffordern. Der Vorgang des Veröffentlichens ist allgemein unter dem Begriff Übertragen (engl. committing) bekannt.

Um Ihre Änderungen anderen zur Verfügung zu stellen, verwenden Sie den Befehl Übertragen.

Danach sind Ihre Änderungen an der Datei button.c im Projektarchiv abgespeichert; falls jemand anders nun eine neue Arbeitskopie von /calc auscheckt, wird diese Ihre letzten Änderungen an der Datei button.c mit enthalten.

Nehmen Sie an, Sie haben eine Mitarbeiterin, Sally, die eine Arbeitskopie von /calc zur selben Zeit wie Sie ausgecheckt hat. Wenn Sie Ihre Änderungen übertragen, bleibt die Arbeitskopie von Sally unverändert. Subversion ändert an einer Arbeitskopie nur dann etwas, wenn Sie es ausdrücklich dazu auffordern.

Um ihre Arbeitskopie auf den neuesten Stand zu bringen, sagt Sally Subversion, dass es ihre Arbeitskopie aktualisieren soll mittels des Aktualisieren Befehls. Dies wird Ihre Änderungen in die Arbeitskopie von Sally einfügen, sowie natürlich alle weiteren Änderungen, welche andere vorgenommen haben seit Sally ihre Arbeitskopie das letzte mal aktualisiert hat.

Beachten Sie, dass Sally nicht angeben muss, welche Dateien genau Subversion aktualisieren soll; Subversion nutzt die Informationen im .svn Ordner und weitere Informationen aus dem Projektarchiv, um dies selbst festzustellen.

Projektarchiv URLs

Auf Subversion Projektarchive kann mittels vieler verschiedener Methoden zugegriffen werden - lokal oder durch verschiedene Netzwerk-Protokolle. Auf ein Objekt im Projektarchiv wird immer über eine URL zugegriffen. Das URL Schema zeigt die Zugriffsmethode:

Tabelle 2.1. Projektarchiv Zugriffs-URLs

SchemaZugriffsmethode
file:// Direkter Zugriff auf einer lokalen Festplatte oder einem Netzwerkverzeichnis.
http:// Zugriff via WebDAV Protokoll auf einen Apache-Server, auf dem Subversion installiert ist.
https:// Wie http://, aber mit SSL-Verschlüsselung.
svn:// Nicht authentifizierter TCP/IP Zugriff mittels eigenem Protokoll auf einen svnserve Server.
svn+ssh:// Authentifizierter, verschlüsselter TCP/IP Zugriff mittels eigenem Protokoll auf einen svnserve Server.

In den weitaus meisten Fällen nutzen Subversion URLs die Standardsyntax und erlauben, dass Servernamen und Portnummern als Teil der URL angegeben werden. Beachten Sie jedoch, dass die file:// Zugriffsmethode normalerweise nur für den Zugriff auf lokale Projektarchive verwendet wird, obwohl auch mittels eines UNC Pfades auf ein Projektarchiv im Netzwerk zugegriffen werden kann. In diesem Fall nimmt die URL die Form file://rechnername/pfad/zum/projektarchiv an. Bei einem lokalen Projektarchiv muss der Rechnername entweder leer oder localhost sein. Deshalb enthalten lokale Pfade meistens drei Schrägstriche, file:///pfad/zum/projektarchiv.

Zudem müssen Benutzer des file:// Schemas auf Windowsrechnern eine nicht offizielle „Standard“ Syntax für die URL verwenden. Jede der folgenden URLs funktioniert, wobei X das Laufwerk mit dem Projektarchiv ist:

file:///X:/path/to/repos
...
file:///X|/path/to/repos
...

Beachten Sie, dass die URL normale Schrägstriche verwendet, obwohl Windows-Pfade mit umgekehrten Schrägstrichen angegeben werden.

Sie können auf FSFS Projektarchive auf einer Netzwerkfreigabe zugreifen, für BDB Projektarchive ist das nicht möglich.

Warnung

Erstellen Sie kein Berkeley DB Projektarchiv auf einer Netzwerkfreigabe oder greifen auf eine solche zu. Eine BDB darf nicht auf einer Netzwerkfreigabe sein! Auch nicht wenn die Netzwerkfreigabe als Laufwerk verbunden ist. Wenn Sie versuchen ein solches Projektarchiv zu verwenden wird dies zu unvorhersehbaren Effekten führen - Sie können mysteriöse Fehlermeldungen gleich zu Beginn erhalten, oder es können Monate vergehen ehe Sie feststellen dass das Projektarchiv korrupt und nicht mehr zu retten ist.

Revisionen

Ein Übertragen Befehl kann Änderungen an beliebig vielen Dateien und Ordnern als eine einzige atomare Operation übertragen. In Ihrer Arbeitskopie können Sie Dateien ändern, erstellen, löschen, umbenennen und verschieben und dann alle diese Änderungen in einem einzigen Schritt übertragen.

Im Projektarchiv wird jede Übertragung als eine einzige atomare Transaktion behandelt: entweder werden alle Änderungen abgespeichert oder gar keine. Subversion stellt dies sogar im Falle von Systemabstürzen, Netzwerkproblemen, Stromausfällen oder anderen Problemen sicher.

Jedes mal wenn ein Projektarchiv eine Übertragung akzeptiert, wird dadurch ein neuer Zustand der Dateistruktur erzeugt. Ein solcher Zustand wird Revision genannt. Jeder Revision wird eine natürliche Zahl zugeordnet, jeweils um eins größer als die vorherige Revision. Der Ursprungszustand eines Projektarchivs bei der Erstellung ist also Revision 0. Revision 0 enthält nichts außer einem leeren Hauptverzeichnis.

Ein möglicher Weg, um sich das Projektarchiv vorzustellen, ist als eine Reihe von Bäumen. Stellen Sie sich eine Reihe von Revisionsnummern vor, beginnend mit 0, sich von links nach rechts ausbreitend. Jede Revisionsnummer hat einen Dateibaum, welcher an dieser Reihe hängt, und jeder dieser Bäume ist eine „Momentaufnahme“ davon, wie das Projektarchiv nach der jeweiligen Übertragung ausgesehen hat.

Abbildung 2.7. Das Projektarchiv

Das Projektarchiv

Es ist wichtig zu beachten, dass Arbeitskopien nicht immer mit einer einzigen Revision des Projektarchivs übereinstimmen; sie können Dateien von verschiedenen Revisionen enthalten. Nehmen Sie zum Beispiel an, Sie haben aus einem Projektarchiv eine Arbeitskopie ausgecheckt, bei welcher die neueste Revision die 4 ist:

calc/Makefile:4
     integer.c:4
     button.c:4

In diesem Moment entspricht die Arbeitskopie exakt der Revision 4 im Projektarchiv. Nun nehmen Sie an, Sie ändern die Datei button.c und übertragen diese Änderungen. Nehmen Sie weiter an, dass keine weiteren Änderungen vorgenommen wurden und Ihre Übertragung eine neue Revision 5 im Projektarchiv erstellt. Ihre Arbeitskopie wird dann so aussehen:

calc/Makefile:4
     integer.c:4
     button.c:5

Nehmen Sie nun an, dass jetzt Sally Änderungen an der Datei integer.c überträgt und damit eine Revision 6 erstellt. Wenn Sie nun Ihre Arbeitskopie aktualisieren, wird dies dann so aussehen:

calc/Makefile:6
     integer.c:6
     button.c:6

Sallys Änderungen an der Datei integer.c werden in Ihre Arbeitskopie eingefügt, und Ihre Änderungen in der Datei button.c werden immer noch vorhanden sein. In diesem Beispiel ist der Inhalt der Datei Makefile identisch in den Revisionen 4, 5 und 6, aber Subversion markiert Ihre lokale Kopie von Makefile mit Revision 6 um zu zeigen, dass diese immer noch aktuell ist. Also nachdem Sie eine saubere Aktualisierung durchgeführt haben, wird Ihre Arbeitskopie exakt einer Revision im Projektarchiv entsprechen.

Wie Arbeitskopien das Projektarchiv verfolgen

Für jede Datei in einer Arbeitskopie zeichnet Subversion zwei wesentliche Informationen im .svn Administrationsordner auf:

  • Auf welcher Revision die Datei basiert (dies wird auch Arbeitsrevision genannt)

  • Der Zeitpunkt, an dem die Datei zum letzten Mal aus dem Projektarchiv aktualisiert wurde.

Mittels dieser Informationen ist Subversion in der Lage, durch Anfragen an das Projektarchiv herauszufinden, in welchem der folgenden vier Zustände eine Datei ist:

Unverändert und aktuell

Die Datei wurde weder lokal noch im Projektarchiv verändert. Eine Übertragung und auch eine Aktualisierung dieser Datei bewirkt nichts.

Lokal verändert und aktuell

Die Datei wurde lokal verändert, aber nicht im Projektarchiv. Eine Übertragung bewirkt ein Speichern dieser Änderungen im Projektarchiv. Eine Aktualisierung hingegen bewirkt nichts.

Unverändert, aber nicht mehr aktuell

Die Datei wurde lokal nicht verändert, jedoch gibt es Änderungen an der Datei im Projektarchiv. Eine Übertragung bewirkt nichts, jedoch wird ein Aktualisieren die Änderungen aus dem Projektarchiv in die lokale Kopie der Datei einfügen.

Lokal verändert und nicht aktuell

Die Datei wurde lokal und im Projektarchiv verändert. Ein Übertragen wird mit einer nicht mehr aktuell Fehlermeldung fehlschlagen. Sie müssen die Datei zuerst Aktualisieren, um die Änderungen aus dem Projektarchiv in die lokale Kopie einzufügen. Falls Subversion nicht in der Lage sein sollte, diese Änderungen selbst zusammenzuführen, was selten der Fall ist, muss der Benutzer den Konflikt manuell lösen.