Verzweigen / Markieren

Eine der Funktionen von Versionskontrollsystemen ist die Möglichkeit, bestimmte isolierte Änderungen auf einer separaten Entwicklungslinie zu machen. Solche Linien werden Zweige genannt. Zweige werden üblicherweise dazu benutzt, um neue Funktionen auszutesten, ohne dadurch die normale Entwicklung am Projekt zu stören. Sobald dann eine solche neue Funktion stabil genug ist, wird der Zweig (branch) mit dem Stamm (trunk) zusammengeführt.

Eine andere wichtige Funktion ist die Möglichkeit, bestimmte Zustände zu markieren (z. B. eine Lieferversion), damit es jederzeit möglich ist, diesen bestimmten Zustand wiederherstellen zu können. Dieser Vorgang wird markieren genannt.

Subversion kennt keinen speziellen Befehl für das Verzweigen oder Markieren und benutzt stattdessen sogenannte billige Kopien. Diese funktionieren ähnlich wie Verweise, d. h., es wird keine richtige Kopie erstellt, sondern nur ein Verweis auf eine bestimmte Revision. Daraus ergibt sich, dass Zweige oder Marken schnell zu erstellen sind und nahezu keinen zusätzlichen Platz im Projektarchiv benötigen.

Einen Zweig oder eine Marke erstellen

Wenn Sie beim Importieren Ihres Projektes die empfohlene Ordnerstruktur verwendet haben, ist ein Verzweigen oder Markieren sehr einfach:

Abbildung 4.51. Der Verzweigen/Markieren-Dialog

Der Verzweigen/Markieren-Dialog


Wählen Sie den Ordner Ihrer Arbeitskopie, von dem Sie einen Zweig oder eine Marke erstellen wollen, und wählen Sie den Befehl TortoiseSVNVerzweigen/Markieren... im Kontextmenü.

Standardmäßig wird die Ziel-URL mit der Quell-URL Ihrer Arbeitskopie vorbelegt. Sie müssen nun diese URL in den Pfad Ihrer neuen Verzweigung oder Markierung ändern. Anstelle von

http://svn.collab.net/repos/ProjektName/trunk

könnte sie wie folgt lauten:

http://svn.collab.net/repos/ProjektName/tags/Version_1.10

Wenn Sie sich nicht mehr daran erinnern, welchen Namen Sie zuletzt vergeben hatten, klicken Sie einfach auf die rechte Schaltfläche. Damit öffnet sich der Projektarchivbetrachter und Sie können sich die Struktur des Projektarchivs ansehen.

Zwischenordner

Wenn Sie die Ziel-URL angeben, müssen alle Ordner bis zum letzten bereits existieren, sonst erhalten Sie eine Fehlermeldung. Im obenstehenden Beispiel muss die URL http://svn.collab.net/repos/ProjectName/tags/ existieren, um die Marke Release_1.10 anlegen zu können.

Wenn Sie allerdings einen Zweig oder eine Marke erstellen wollen, die Ordner enthält, die noch nicht existieren, können Sie die Option Zwischenordner erstellen markieren. Dann werden alle Zwischenordner automatisch erstellt.

Beachten Sie bitte, dass diese Option standardmäßig deaktiviert ist, um Schreibfehler zu vermeiden. Sollten Sie z. B. die Ziel-URL als http://svn.collab.net/repos/ProjectName/Tags/Release_1.10 anstelle von http://svn.collab.net/repos/ProjectName/tags/Release_1.10 angegeben haben, so erhalten Sie eine Fehlermeldung, wenn die Option nicht aktiv ist. Wenn die Option aktiv ist, würde Ihre Markierung in einem neuen Ordner Tags angelegt und nicht wie gewünscht im vorhandenen Ordner Marken.

Nun haben Sie mehrere Möglichkeiten, die Quelle der Kopie auszuwählen:

HEAD-Revision im Projektarchiv

Der neue Zweig wird direkt im Projektarchiv als Kopie der HEAD-Revision erstellt. Dabei werden keine Daten von Ihrer Arbeitskopie in das Projektarchiv übertragen und der Zweig kann sehr schnell erzeugt werden.

Revisionsnummer im Projektarchiv

Der neue Zweig wird direkt im Projektarchiv kopiert. Sie können aber auch eine ältere Revision auswählen. Das ist dann nützlich, wenn Sie z. B. vergessen haben, eine Marke anzulegen, als die Lieferversion in der letzten Woche erstellt wurde. Wenn Sie sich nicht mehr an die Revisionsnummer erinnern können, dann klicken Sie auf die Schaltfläche rechts und wählen die Revisionsnummer aus. Auch dabei werden keine Daten aus Ihrer Arbeitskopie an das Projektarchiv übertragen, sodass der Zweig sehr schnell erstellt werden kann.

Arbeitskopie

Der neue Zweig ist eine identische Kopie Ihrer lokalen Arbeitskopie. Egal, ob Sie einige Dateien durch die einer älteren Revision ersetzt haben oder sie geändert haben, diese Dateien sind genau die, die in diesen Zweig kopiert werden. Natürlich erfordert diese aufwändige Markierung, dass Daten von Ihrer Arbeitskopie zurück in das Projektarchiv übertragen werden müssen, sofern sie dort noch nicht existieren.

Wenn Sie wollen, dass Ihre Arbeitskopie sofort zum neuen Zweig/Marke wechselt, aktivieren Sie die Option Arbeitskopie zum neuen Zweig/Marke wechseln. Wenn Sie das tun, stellen Sie bitte vorher sicher, dass Ihre Arbeitskopie keine Änderungen enthält. Wenn sie Änderungen enthält, werden diese beim Wechseln mit dem Zweig zusammengeführt.

Falls Ihre Arbeitskopie weitere mittels svn:externals eingebundene Projekte enthält, werden diese am Ende des Dialogs aufgelistet. Für jedes externe Ziel wird der Pfad und die Quell-URL angezeigt.

Wenn Sie sicherstellen möchten, dass die neue Marke sich immer in einem konsistenten Zustand befindet, sorgen Sie dafür, dass die Revisionen aller Externals fixiert werden. Sollten Sie das nicht tun und die Externals zeigen auf eine HEAD-Revision, die sich ja in der Zukunft ändern könnte, so wird beim Auschecken der neuen Marke die HEAD-Revision des Externals ausgecheckt und Ihre Marke lässt sich unter Umständen nicht mehr übersetzen. Es ist also immer eine gute Idee, die Externals beim Anlegen einer Marke auf eine fixe Revision zu setzen.

Die Externals werden, abhängig von der Quelle der Markierung, entweder automatisch an der aktuelle HEAD-Revision des Projektarchivs oder die BASE-Revision der Arbeitskopie fixiert:

Tabelle 4.1. Fixe Revision

Quelle der KopieFixe Revision
HEAD-Revision im ProjektarchivHEAD-Revision des externen Projektarchivs
Revisionsnummer im ProjektarchivHEAD-Revision des externen Projektarchivs
ArbeitskopieBASE-Revision der externen Arbeitskopie


Externals innerhalb von Externals

Wenn ein extern eingebundenes Projekt weitere externe Projekte einbindet, werden diese nicht markiert! Es können nur externe Projekte markiert werden, die direkte Kinder des Projekts sind.

Klicken Sie OK, um die neue Kopie in das Projektarchiv zu übertragen und vergessen Sie dabei nicht, eine Logmeldung anzugeben. Beachten Sie, dass diese Kopie innerhalb des Projektarchivs angelegt wird.

Beachten Sie, dass das Anlegen eines Zweiges oder einer Marke sich nicht auf Ihre Arbeitskopie auswirkt, es sei denn, Sie haben die Option zum Wechseln auf den Zweig gleich mit aktiviert. Auch wenn Sie den Zweig aus der Arbeitskopie heraus erstellen, werden die Änderungen darin in den neuen Zweig übertragen und nicht in den Stamm. Die geänderten Dateien Ihrer Arbeitskopie bleiben als gegenüber dem Stamm verändert markiert.

Andere Wege, einen Zweig oder eine Marke erstellen

Sie können einen Zweig oder eine Marke ohne eine Arbeitskopie zu erstellen. Dazu öffnen Sie zunächst den Projektarchivbetrachter. Dort können Sie Ordner an einen neuen Platz ziehen und ablegen. Dabei müssen Sie die Strg-Taste gedrückt halten, um eine Kopie zu erstellen. Andernfalls wird der Ordner nur verschoben und nicht kopiert.

Alternativ können Sie einen Ordner mit gedrückter rechter Maustaste ziehen und ablegen. Sobald Sie die Maustaste loslassen, können Sie per Kontextmenü wählen, ob der Ordner verschoben oder kopiert werden soll. Zum Erstellen eines Zweiges oder einer Marke müssen Sie den Ordner kopieren.

Eine weitere Möglichkeit dazu besteht im Log-Dialog. Lassen Sie sich das Log anzeigen, markieren eine Revision in der Liste und wählen KontextmenüErstelle Zweig/Marke von Revision.

Auschecken oder Wechseln...

...das ist hier (eigentlich nicht) die Frage. Während beim Auschecken eine neue Arbeitskopie (z. B. des neu erstellten Zweiges) erstellt wird, verändert der Befehl TortoiseSVNWechseln zu... Ihre bestehende Arbeitskopie so, dass diese genau wie der erstellte Zweig aussieht. Dabei werden nur die Unterschiede zwischen Ihrer bestehenden Arbeitskopie und dem Zweig des Projektarchivs übertragen, was sich natürlich günstig auf die Netzwerkauslastung und Ihre Geduld auswirkt. :-)

Es gibt mehrere Möglichkeiten, mit Ihrer neuen Verzweigung oder Markierung weiterzuarbeiten. Sie können:

  • TortoiseSVNAuschecken, um eine neue Arbeitskopie in einem leeren Ordner zu erstellen. Sie können von einem Projektarchiv so viele Arbeitskopien erstellen, wie Sie möchten.

  • Wechseln Sie mit Ihrer Arbeitskopie zu Ihrer neuen Kopie im Projektarchiv. Dazu wählen Sie TortoiseSVNWechseln zu... aus dem Kontextmenü.

    Im folgenden Dialog geben Sie die URL des Zweiges an, den Sie gerade erzeugt haben. Wählen Sie die Option HEAD-Revision und bestätigen Sie mit OK. Ihre Arbeitskopie wird nun auf den neuen Zweig bzw. die neue Marke umgestellt.

    Wechseln zu wird genauso wie Aktualisieren niemals lokale Änderungen verwerfen. Sämtliche noch nicht übertragene Änderungen werden beim Wechseln mit den Daten aus dem Projektarchiv zusammengeführt. Wenn Sie das nicht wünschen, müssen Sie entweder die Änderungen übertragen oder verwerfen, bevor Sie Wechseln zu aufrufen.

  • Wenn Sie auf dem Stamm und einem Zweig gleichzeitig arbeiten wollen, aber nicht auf ein vollständiges Auschecken warten wollen, können Sie mit dem Explorer Ihre Arbeitskopie kopieren und mit der Kopie über TortoiseSVNWechseln zu... auf den Zweig wechseln.

Abbildung 4.52. Der Wechseln-Zu-Dialog

Der Wechseln-Zu-Dialog


Obwohl Subversion keine Unterscheidung zwischen tags und branches macht, werden sie normalerweise unterschiedlich genutzt.

  • Tags (= Marken) werden typischerweise dafür verwendet, einen Entwicklungszeitpunkt einzufrieren. Als solche werden sie normalerweise nicht für die Weiterentwicklung genutzt. Dafür sind Verzweigungen (= branches) gedacht. Das ist auch der Hauptgrund, warum wir die Struktur /trunk /branches /tags für Projektarchive empfehlen. Änderungen an einer markierten Revision vorzunehmen, ist keine gute Idee. Da aber die Daten in Ihrer Arbeitskopie nicht schreibgeschützt sind, kann es aus Versehen doch passieren. TortoiseSVN wird Sie jedoch warnen, wenn Sie versuchen, Änderungen in einem Pfad im Projektarchiv zu übertragen, den die Zeichenfolge /tags enthält.

  • Möglicherweise wollen Sie doch weitere Änderungen an einer Revision vornehmen, die Sie bereits markiert haben. Die korrekte Vorgehensweise ist, zunächst per Verzweigen/Markieren einen neuen Zweig aus der Marke (z. B. /branches/Version_1.0.x aus /tags/Version_1.0) zu erzeugen und die Änderungen auf dem Zweig durchzuführen. Wenn Sie Ihre Änderungen durchgeführt haben, erzeugen Sie eine neue Marke (z. B. /tags/Version_1.0.1) aus dem Zweig, an dem Sie gearbeitet haben.

  • Wenn Sie eine Arbeitskopie, die auf einem Zweig basiert, verändern und die Änderungen übertragen, gehen diese in den neuen Zweig und nicht in trunk. Nur die Unterschiede werden gespeichert. Der Rest bleibt eine billige Kopie.