14.11 Versionsverwaltung mit Bazaar 

14.11.1 Was ist Bazaar? 

Bazaar (http://bazaar-vcs.org/) ist ein frei verfügbares dezentrales Versionsverwaltungssystem und eine Implementierung des GNU-Arch-Protokolls. Es besteht eine enge Zusammenarbeit zwischen dem Team rund um Bazaar und der GNU-Arch-Community.
Bazaar verfolgt einen etwas anderen Ansatz als andere Versionskontrollen:
- Jede Revision, d. h. jede Änderung am Quelltext, ist eindeutig identifizierbar. Dadurch sind Zusammenführungen von vollständig ungleichartigen Quellcodebäumen möglich.
- GNU-Arch operiert dezentral, das bedeutet, dass es keine Notwendigkeit für einen zentralen Server mit getrennter Benutzerverwaltung gibt. Allerdings unterstützt Bazaar sowohl den Ansatz mit als auch den ohne zentralen Server. Es ist darüber hinaus möglich, beide Ansätze gleichzeitig bei einem Projekt anzuwenden.
Die Website Launchpad bietet einen kostenlosen Hosting-Dienst für Bazaar-Projekte im Bereich Open Source an. Sie erfahren mehr über Launchpad im Abschnitt »Das Projekt veröffentlichen«, unter dem Stichwort »Launchpad«.
Offizielles GNU-Projekt
Bazaar wird zurzeit (Stand: April 2010) hauptsächlich für die Entwicklung von Ubuntu und Launchpad eingesetzt, steht aber selbstverständlich auch anderen freien Softwareprojekten zur Verfügung. Im Februar 2008 wurde Bazaar ein offizielles GNU-Projekt und hat damit den offiziellen Segen von Richard Stallman erhalten. Es ist für die Plattformen Windows, GNU/Linux und Mac OS erhältlich. Canonical bietet offiziellen und kostenpflichtigen Support für Bazaar an. Im Abschnitt »GNU« haben Sie bereits mehr über GNU erfahren.
Was ist eine Versionsverwaltung?
Unter einer Versionsverwaltung versteht man ein System, das typischerweise in der Softwareentwicklung zur Versionierung eingesetzt wird, um den gemeinsamen Zugriff auf Quelltexte zu kontrollieren. Hierzu werden alle laufenden Änderungen erfasst und alle Versionsstände der Dateien in einem Archiv mit Zeitstempel und Benutzerkennung gesichert.
Es wird sichergestellt, dass jeder Benutzer mit dem aktuellen Stand arbeitet oder auf Wunsch auf die archivierten Stände zugreifen kann. Dadurch ist eine Versionsverwaltung nicht nur für professionelle Entwickler in großen Teams, sondern auch für einzelne Entwickler interessant. Auf diese Weise kann jederzeit eine ältere Version aufgerufen werden, falls eine Änderung nicht funktioniert oder der Benutzer nicht mehr sicher ist, was nun alles geändert wurde. Das zentrale Archiv wird als Paketquelle (englisch: repository für »Behälter«, »Aufbewahrungsort«) bezeichnet.
Auch bei einer Softwareverwaltung spricht man von Repositorys, da Ubuntu seinen Softwarestatus mit diesen Archiven abgleicht und so mehrere Komponenten des Betriebssystems gleichzeitig aktualisieren kann. Dies geht so weit, dass Sie sogar von einer älteren Ubuntu-Version auf eine neue aktualisieren können, indem Sie andere Repositorys wählen.
Nachvollziehbare Änderungen
Ein Beispiel ist die Wikipedia. Hier erzeugt die Software nach jeder Änderung eines Artikels eine neue Version. Da zu jedem Versionswechsel die grundlegenden Angaben wie Verfasser und Uhrzeit festgehalten werden, kann jeder genau nachvollziehen, wer was wann geändert hat. Bei Bedarf – beispielsweise bei versehentlichen Änderungen – kann zu einer früheren Version zurückgekehrt werden. Es wird sichergestellt, dass jeder Benutzer mit dem aktuellen Stand arbeitet oder auf Wunsch auf die archivierten Stände zugreifen kann. Dadurch ist eine Versionsverwaltung nicht nur für professionelle Entwickler in großen Teams, sondern auch für einzelne Entwickler interessant.
Server – ja oder nein?
Wie bereits erläutert, operiert GNU-Arch dezentral, folglich gibt es keinerlei Notwendigkeit für einen zentralen Server mit getrennter Benutzerverwaltung. Allerdings unterstützt Bazaar sowohl den Ansatz mit als auch den ohne zentralen Server. Es ist darüber hinaus möglich, beide Ansätze gleichzeitig bei einem Projekt anzuwenden.
Installation
Bazaar ist selbstverständlich über die Paketquellen von Ubuntu erhältlich. Sie installieren die nötigen Pakete mit:
sudo apt-get install bzr bzr-gtk
Das Paket bzr-gtk stellt Olive, eine optionale grafische Oberfläche für Bazaar, zur Verfügung (siehe Abschnitt »Olive«).
14.11.2 Ein erstes kleines Projekt 

Bevor Sie mit der grafischen Oberfläche von Bazaar arbeiten können, müssen Sie einige Angaben im Terminal erledigen.
Kennung erstellen
Eine grundlegende Aufgabe eines Versionsverwaltungssystems ist die Möglichkeit zur Zusammenarbeit mehrerer Projektteilnehmer. Um vorgenommene Änderungen am Projekt einzelnen Mitgliedern dieser Gruppe zuordnen zu können, muss Bazaar mitgeteilt werden, wer an dem Projekt arbeitet.
Mein Name ist ...
Der erste Schritt besteht also darin, dass Sie sich Bazaar einmal persönlich vorstellen und dem Programm Ihren Namen und Ihre E-Mail-Adresse verraten. Dies geschieht durch folgendes Kommando:
bzr whoami "Marcus Fischer bzr@marcus-fischer.com"
Bitte achten Sie darauf, dass Sie auch wirklich die Anführungszeichen verwenden. Ansonsten meldet sich Bazaar mit einem Fehler.
Bazaar richtet jetzt eine Konfigurationsdatei ein, in der Ihr Name und Ihre E-Mail-Adresse abgelegt sind. Um die Korrektheit Ihrer Daten zu überprüfen, können Sie mit
bzr whoami Marcus Fischer bzr@marcus-fischer.com
die vorhandenen Angaben überprüfen.
Projekt auswählen
Erstellen Sie nun ein Verzeichnis, das als Heimat Ihres Projekts dienen soll, und füllen Sie es mit den Dateien, die von Bazaar verwaltet werden sollen. In diesem Beispiel lege ich mit dem Befehl touch einige (leere) Textdokumente an.
mkdir Projekt cd Projekt touch test1.txt test2.txt test3.txt
Bazaar weiß an dieser Stelle natürlich noch nicht, dass es für dieses Verzeichnis zuständig ist bzw. dieses überwachen soll. Zu diesem Zweck müssen Sie Bazaar in diesem Verzeichnis initialisieren. Achten Sie bei der Initialisierung darauf, dass Sie sich im Terminal wirklich in dem gewählten Verzeichnis befinden. Sie erreichen die Initialisierung mit:
bzr init
Keine Antwort ist eine Antwort!
Wundern Sie sich nicht, wenn der Befehl keine Antwort erzeugt. Da es sich bei Bazaar um ein offizielles GNU-Projekt handelt, folgt es auch den Prinzipien von GNU. Dies bedeutet unter anderem, dass bei der erfolgreichen Ausführung eines Befehls keine Rückmeldung erfolgt. Nur Fehler führen zu Hinweisen. In Wirklichkeit war Bazaar im Hintergrund sehr fleißig, denn es hat durch den Initialisierungsvorgang einen sogenannten Zweig erstellt. In einem solchen Zweig werden die Dateien einer Versionsverwaltung gespeichert, wie beispielsweise Angaben über Änderungen an den vorhandenen Dateien.
Olive
Sie können ab diesem Zeitpunkt auch die grafische Oberfläche Olive einsetzen (siehe Abbildung). Ein beliebiges Projekt können Sie sich bei einer Zusammenarbeit mehrerer Teilnehmer wie einen Baum vorstellen, dessen Zweige einzelnen Entwicklungen entsprechen. Alle Zweige führen zurück zum Stamm des Baumes und damit letztendlich zum Projekt selbst. In diesem Zusammenhang versteht man auch die Namensgebung Olive, die sich auf die Frucht eines dieser Zweige bezieht.
Abbildung 14.13 Mit »Olive« können Sie »Bazaar« auch mittels einer grafischen Oberfläche verwenden.
Der nächste Schritt besteht darin, dass Sie Bazaar mitteilen, welche Dateien in diesem Zweig verfolgt (englisch to track) werden sollen. Bazaar geht hierbei nicht automatisch davon aus, dass alle Dateien innerhalb eines Zweiges verfolgt werden sollen. Sie erreichen eine komplette Verfolgung aller Dateien durch:
user$ bzr add added test1.txt added test2.txt added test3.txt
Hier werden rekursiv alle Dateien innerhalb des Zweiges hinzugefügt. Wenn Sie nur einzelne Dateien verfolgen möchten, geben Sie diese einfach hinter bzr add an.
Legen Sie jetzt einen Startpunkt fest, ab dem die Verfolgung der Dateien durch Bazaar beginnen soll. Dies erreichen Sie dadurch, dass Sie den derzeitigen Stand Ihrer Dateien Bazaar hinzufügen. Sie machen einen sogenannten Snapshot (deutsch »Schnappschuss«):
bzr commit -m "Erste Version"
Wir geben dem derzeitigen Stand den Kommentar »Erste Version« mit auf den Weg. Bitte gewöhnen Sie sich das Kommentieren an, damit Sie später noch den Überblick haben, wann welche Änderung vorgenommen wurde.
Startpunkt
Es mag verwirrend erscheinen, dass wir zuerst einem Zweig Dateien hinzufügen und danach diese Dateien Bazaar mitteilen. Hierbei ist es wichtig, zu unterscheiden, dass wir im ersten Schritt Bazaar lediglich mitgeteilt haben, welche Dateien verfolgt werden sollen. Im zweiten Schritt lassen wir Bazaar den Snapshot dieser Dateien erstellen.
Bazaar speichert diese Snapshots ab, so dass Sie zu einem späteren Zeitpunkt auf Wunsch Ihre Änderungen verwerfen und zu dem damaligen Zeitpunkt des Snapshots zurückkehren können. Wie ich bereits erwähnt habe, ist Bazaar ein dezentrales Versionskontrollsystem und benötigt daher keinen Zugriff auf einen zentralen Server, um diese Snapshots abzuspeichern. Alle nötigen Konfigurationsdateien, Revisionen und Verfolgungsprotokolle werden in dem aktuellen Verzeichnis im versteckten Ordner ./bzr gespeichert.
Änderungen vornehmen
Eine (Projekt-)Entwicklung sollte möglichst dynamisch erfolgen, und so haben wir es im Laufe der Zeit mit vielen Änderungen zu tun. Also nehmen wir eine Änderung an einer der Dateien vor. Wir haben leere Textdateien angelegt, so dass es sich jetzt anböte, eine dieser Dateien mit Inhalt zu füllen.
Rufen Sie also eine dieser Dateien mit Ihrem Lieblingseditor auf (grafisch oder im Terminal mit gedit test1.txt). In Olive reicht es, wenn Sie die zu ändernde Datei doppelt anklicken. Schreiben Sie als Nächstes etwas dort hinein, beispielsweise das Wort »test«. Nach dem Abspeichern dieser Änderungen im Editor können Sie diesen wieder schließen und sich mit Hilfe von Bazaar die Veränderung anzeigen lassen:
bzr diff === modified file 'test1.txt' --- test1.txt 2008-04-29 13:41:39 +0000 +++ test1.txt 2008-04-29 14:29:41 +0000 @@ –0,0 +1,1 @@ +test
Sie können sich die Veränderungen auch mit Olive anzeigen lassen. Klicken Sie zu diesem Zweck einfach auf den Button Complete Diff; es erscheint das Fenster aus Abbildung.
Abbildung 14.14 Veränderungen an den Dateien lassen sich leicht verfolgen.
Nach umfangreichen Änderungen ist es sinnvoll, wenn Sie einen neuen Snapshot anlegen:
bzr commit -m "Ein Wort hinzugefügt" Committed revision 2.
Selbstverständlich brauchen Sie nicht bei jeder kleinen Änderung (wie der eben beschriebenen) einen neuen Snapshot anzulegen. Aber wenn Sie dies tun, dann sollten Sie auf eine aussagekräftige Bezeichnung achten. Das erleichtert das spätere Nachvollziehen einzelner Änderungen im sogenannten Revisions-Log.
Revisions-Log
Das Revisions-Log stellt quasi die Geschichte Ihres Zweiges dar, indem es alle angefertigten Snapshots mit den dazugehörigen Kommentaren auflistet. Sie können sich die bisherige Geschichte ansehen, indem Sie bzr log im Terminal eingeben:
bzr log ------------------------------------------------------------ revno: 2 committer: Marcus Fischer bzr@marcus-fischer.com branch nick: Projekt timestamp: Tue 2008-04-29 16:41:42 +0200 message: Ein Wort hinzugefügt ------------------------------------------------------------ revno: 1 committer: Marcus Fischer bzr@marcus-fischer.com branch nick: Projekt timestamp: Tue 2008-04-29 15:41:39 +0200 message: Erste Version
Grafisch erreichen Sie dies, wenn Sie in Olive auf Log klicken (die Beschriftung erscheint, wenn Sie den Mauszeiger auf die Symbole in der Werkzeugleiste bewegen).
14.11.3 Das Projekt veröffentlichen 

Bisher haben Sie ausschließlich allein an Ihrem Projekt gearbeitet. Auch hierbei ist es durchaus sinnvoll, ein Versionskontrollsystem wie Bazaar zu benutzen, beispielsweise um bei Fehlern zu einem früheren Zustand der Entwicklung zurückkehren zu können.
Wenn Sie mit mehreren Benutzern zusammen an einem Projekt arbeiten, ist dieser lokale Zweig Ihrer Entwicklung wenig sinnvoll, wenn er nicht mit anderen abgeglichen werden kann. Zum Abgleich benötigen Sie entweder Zugriff auf einen privaten Server per FTP, oder Sie legen sich einen Account bei Launchpad an. Wenn Sie eine Website besitzen, haben Sie oftmals auch einen FTP-Zugang und etwas Platz auf dem Server.
Launchpad ist eine Sammlung von Werkzeugen zur Entwicklung und Bereitstellung von freien Softwareprojekten. Sie erfahren mehr über Launchpad hier in diesem Abschnitt »Launchpad«.
FTP-Server
Wir beginnen mit der Veröffentlichung auf einem FTP-Server. Im Folgenden gehen wir davon aus, dass auf dem Server ein Ordner mit dem Namen /Projekt existiert. Installieren Sie für die Verwendung des standardmäßig vorhandenen sFTP (secure FTP) zuerst das Paket paramiko:
sudo apt-get install python-paramiko
Zum Veröffentlichen existiert in Bazaar der Befehl push:
bzr push --create-prefix sftp://your.name@example.com/Projekt 2 revision(s) pushed.
Durch diesen Befehl erstellt Bazaar den entsprechenden Ordner auf dem Server und schiebt (englisch: to push) Ihren Zweig in diesen. Jetzt kann jeder Benutzer seinen eigenen Zweig erstellen, indem er Folgendes in sein Terminal eingibt:
bzr branch http://www.example.com/Projekt
Auf Launchpad veröffentlichen
Wenn Sie keinen eigenen FTP-Server besitzen oder eine elegante und dazu noch kostenfreie Möglichkeit suchen, Ihren Zweig zu veröffentlichen, dann bietet Ihnen Canonical einen kostenlosen Account auf Launchpad an (siehe Abbildung).
Um Launchpad zu nutzen, benötigen Sie ein Benutzerkonto (englisch account). Die Anmeldung an Launchpad ist kostenlos. Sie benötigen außerdem einen SSH-Schlüssel, um Launchpad mit Bazaar verwenden zu können. Wie Sie einen SSH-Schlüssel erstellen, ist in Abschnitt »ssh« beschrieben. Öffnen Sie nun Ihren Launchpad-Account, und registrieren Sie Ihr Projekt, indem Sie im Reiter Code links auf den Link Register branch klicken. Nach der Registrierung können Sie Ihr Projekt mit Bazaar hochladen. Dies geschieht durch
bzr push bzr+ssh://Ihr.Name@bazaar.launchpad.net/ Ihr.Name/+junk/Projekt
Den Eintrag Ihr.Name ersetzen Sie bitte durch Ihren Benutzernamen auf Launchpad. Diesen Namen können Sie sich – je nach Verfügbarkeit – zulegen. Er muss nicht zwangsläufig Ihrem realen Namen entsprechen. Lassen Sie sich nicht durch das Kürzel +junk in der Adresse Ihres Projektes verunsichern. Dies bedeutet auf keinen Fall, dass Ihr Projekt automatisch dem Müll zugeordnet wird, sondern lediglich, dass Ihr Projekt mit keinem anderen existierenden Projekt verknüpft ist.
Abbildung 14.15 Die Startseite von »Launchpad«
Andere können mitentwickeln
Launchpad ist eine Basis für die Entwicklung von Open-Source-Software, und mittlerweile ist die Plattform selbst auch Open Source. Dies bedeutet, dass selbstverständlich jeder Interessierte eine eigene Kopie Ihres Zweiges anlegen kann. Dies geschieht durch die Kenntnis der Adresse und die Eingabe folgender Zeile in einem Terminal:
bzr branch http://bazaar.launchpad.net/ Ihr.Name/+junk/Projekt
Auf Ihrer Launchpad-Projektseite können Sie sich ebenfalls umfangreiche Informationen, beispielsweise das Revisions-Log, ansehen. Selbstverständlich können Sie sich auch jederzeit Kopien von den Projekten anderer Benutzer anlegen und ihnen bei der Entwicklung helfen. Launchpad vereinfacht erheblich die Zusammenarbeit an solchen Projekten.
Auf dem Laufenden bleiben
Wenn mehrere Personen gemeinsam an einem Projekt beteiligt sind, kann es natürlich passieren, dass die Teilnehmer gleichzeitig daran arbeiten. Daher ist es sehr wichtig, dass Sie lokal immer einen aktuellen Zweig vorhalten. Dies geschieht durch regelmäßiges Abgleichen mit dem sogenannten »Hauptzweig«, dem Repository, von dem alle Teilnehmer eine Kopie auf ihren lokalen Rechnern besitzen. Der Abgleich ist nichts anderes als das Zusammenführen diverser Änderungen und geschieht durch bzr merge. Prüfen Sie durch bzr diff was sich verändert hat. Wenn Sie mit den Änderungen einverstanden sind, können Sie diese zu Ihrem persönlichen Zweig hinzufügen:
bzr commit -m "Abgleich" Committed revision xy.
Änderungen hochladen
Zurzeit profitieren Sie nur von dem Projekt, geben aber nichts zurück. Wenn Sie die Änderungen, die Sie selbst an dem Projekt getätigt haben, hochladen möchten, bietet sich der sogenannte merge directive (Befehl oder Richtlinie zur Zusammenführung) an. Dieser merge directive ist eine maschinenlesbare Anfrage nach einem partiellen Zusammenführen der »Patches« (Flicken). In der Regel enthält eine solche Anfrage eine Vorschau des Patches und die nötigen Revisionen oder einen Zweig, der diese enthält:
bzr send -o mein-code.patch
Nachdem Sie den Patch hochgeladen haben, wird automatisch eine E-Mail an alle Teilnehmer des Projekts sowie den »Maintainer« (Hauptentwickler) des Projekts verschickt. Die Hauptentwickler des Projekts (Ersteller des Zweigs) sind nun in der Lage, Ihre Verbesserungsvorschläge zu begutachten und bei Bedarf in den Hauptzweig zu integrieren.
Die vorliegende Anleitung ersetzt selbstverständlich keine umfassende Dokumentation, sollte aber dennoch für einen Einstieg genügen. Um mehr über Bazaar zu lernen, können Sie auch die integrierte Hilfe nutzen. Mit bzr help erfahren Sie mehr über die Arbeitsweise von Bazaar, und durch bzr help commands erhalten Sie eine Übersicht und Erklärung aller Bazaar-Befehle.