Mercurial (hg) verwaltet Versionen

Aus EasyLinux 01/2015

Mercurial (hg) verwaltet Versionen

Vorher und nachher

Wer Textdateien, wie etwa Konfigurations-, Programmquellcode- oder Skriptdateien, regelmäßig überarbeitet, sollte eine Versionsverwaltung nutzen, um auch auf alte Versionen zurückgreifen zu können: Dann bleiben Fehler beim Überarbeiten folgenlos.

Stellen Sie sich folgendes Szenario vor: Sie folgen einer Anleitung aus dem Internet und ändern mit Root-Rechten eine der Konfigurationsdateien im Ordner /etc – doch nach der Änderung funktioniert die zugehörige Software nicht mehr wie gewünscht. Die Rückkehr zur alten Fassung ist aber versperrt, denn Sie haben vergessen, eine Sicherheitskopie zu erstellen.

Das ist noch nicht direkt ein Beispiel, in dem sich der Einsatz einer Versionsverwaltung lohnt – bleibt die Änderung ein einmaliger Vorgang, reicht es aus, eine Backup-Kopie zu erstellen (z. B. mit cp datei datei.bak). Doch wenn Sie an einigen Dateien häufiger Änderungen vornehmen, möchten Sie sich vielleicht die Möglichkeit bewahren, zu beliebigen älteren Fassungen der Datei zurückkehren zu können. Auch das geht manuell, etwa in dem Sie Kopien erstellen, welche das Dateidatum integrieren (datei.2014-12-01, datei.2014-12-24 etc.). Ab jetzt ist es sinnvoller, ein Tool einzusetzen, das speziell für das Verwalten verschiedener Dateiversionen geschaffen wurde – zum Beispiel Subversion [1] und ein KDE-GUI-Tool, das wir in einem älteren Artikel beschrieben haben [2] – oder auf der Kommandozeile das Programm Mercurial [3].

Mit Mercurial, das Sie unter OpenSuse über sudo zypper in mercurial und unter Kubuntu mit sudo apt-get install mercurial installieren, können Sie in jedem beliebigen Ordner damit beginnen, Versionen der Dateien aufzubewahren. Das Tool wird dazu einen versteckten Unterordner .hg anlegen und dort alte Versionen – genauer: Beschreibungen der Unterschiede zwischen je zwei aufeinander folgenden Versionen – und Verwaltungsinformationen ablegen.

Mercurial einrichten

Vor dem ersten Einsatz möchte Mercurial wissen, wer Sie sind: Das Tool speichert zu jeder Änderung auch Informationen über die Person, die für die neue Version verantwortlich ist, denn Dateien können auch von mehreren Anwendern überarbeitet werden. So sieht man später auf einen Blick, wer was geändert hat.

Um Ihren Namen zu erfassen, verwenden Sie den Mercurial-Befehl hg (benannt nach dem chemischen Element Quecksilber, englisch: Mercury, Symbol: Hg) wie folgt:

hg config --edit

Das Tool fragt nun eventuell, welchen Editor Sie nutzen wollen; geben Sie die Ziffer ein, die zum gewünschten Programm passt. Dann ergänzen Sie hinter username Ihren Namen und die Mail-Adresse (Abbildung 1). Die Einstellungen speichert Mercurial in der Datei .hgrc in Ihrem Home-Verzeichnis.

Abbildung 1: Geben Sie einmalig Ihren Namen und eine Mail-Adresse an, um Mercurial zu personalisieren.

Abbildung 1: Geben Sie einmalig Ihren Namen und eine Mail-Adresse an, um Mercurial zu personalisieren.

Nun ist das Programm bereit zum Verwalten von Dateiversionen. Wechseln Sie in einen Ordner, der Dateien enthält, mit denen Sie dies ausprobieren möchten; für erste Tests können Sie auch einen Unterordner test anlegen und ein paar Dateien hinein kopieren.

Verzeichnis initialisieren

In jedem Ordner, den Sie unter die Verwaltung von Mercurial stellen möchten, geben Sie zunächst das Kommando

hg init

ein. Das Tool legt dann einen versteckten Unterordner .hg/ an und ist ab sofort bereit, Versionen von Dateien in diesem Ordner zu verwalten. Dabei ignoriert es aber zunächst sämtliche im Ordner liegenden Dateien – Sie müssen diese manuell mit hg add hinzufügen. Liegen im aktuellen Verzeichnis z. B. datei1.txt, datei2.txt und datei3.txt und möchten Sie die ersten beiden Dateien über Mercurial verwalten, geben Sie

hg add datei1.txt datei2.txt

ein. Mit hg status erhalten Sie eine Übersicht zu den Dateien im Ordner:

$ hg status
A datei1.txt
A datei2.txt
? datei3.txt

Das “A” steht jeweils dafür, dass die Datei hinzugefügt (aber noch nie gesichert) wurde, das Fragezeichen bedeutet, dass Mercurial diese Datei ignoriert.

Tatsächlich haben Sie damit nicht nur für den aktuellen Ordner, sondern auch für alle schon vorhandenen und künftigen Unterordner festgelegt, dass diese zusammen ein “Repository” bilden, dessen “Repository-Wurzelverzeichnis” der aktuelle Ordner ist. Unterordner werden nur dann von Mercurial verwaltet, wenn Sie diese mit hg add (wie oben für einzelne Dateien) aufnehmen; in dem Fall fügt das Tool aber rekursiv alle enthaltenen Dateien und weiteren Unterordner hinzu.

In Unterordnern, die bereits zu einem Repository gehören, sollten Sie darum in der Regel nicht hg init ausführen – das ist zwar möglich, kann aber zu Verwirrung führen, weil dieser Unterordner dann ein neues Repository bildet und nicht mehr vom ursprünglichen Repository mitverwaltet wird.

Commit bzw. Check-in

Die wichtigste Operation heißt “commit” (deutsch u. a.: jemandem etwas anvertrauen) oder “check-in”. Geben Sie

hg commit

ein, startet Mercurial einen Editor, in dem Sie im oberen Bereich eine Notiz eingeben können, z. B.: “Das ist die erste Version der Datei.” Später nutzen Sie diesen Notizbereich, um eine kurze Beschreibung der Änderungen zu erfassen. Wenn Sie speichern und den Editor verlassen, sichert das Tool die aktuellen Versionen der beiden verwalteten Dateien. Dass diese jetzt aktuell sind, erkennen Sie beim erneuten Aufruf von hg status:

$ hg status
? datei3.txt

Die Dateien datei1.txt und datei2.txt erscheinen nicht mehr in der Liste, denn die von Mercurial gesicherte und die aktuelle Version im Ordner sind identisch. Ändern Sie nun datei1.txt und zeigen den Status nochmals an, erscheint die Datei wieder – diesmal mit dem Buchstaben “M”:

M datei1.txt

Das “M” steht für “modified” (deutsch: verändert). Die neue Version könnten Sie nun über hg commit ergänzen – damit kennt Mercurial dann schon zwei Varianten der Datei, zu denen es jeweils das Commit-Datum und Ihre Identität speichert.

Unterschiede

Um zu prüfen, wie sich die aktuelle Version einer Datei von der letzten in Mercurial gesicherten Version unterscheidet, können Sie das Kommando hg diff verwenden, das für alle Dateien Änderungen anzeigt, die zum aktuellen Repository gehören (und vom Tool verwaltet werden). Soll die Ausgabe auf eine bestimmte Datei beschränkt bleiben, geben Sie den Dateinamen als weiteres Argument an (Abbildung 2). Für die Darstellung der Unterschiede verwendet das Tool das Programm diff.

Abbildung 2: Mit "hg diff dateiname" zeigen Sie die Dateiänderungen gegenüber der letzten archivierten Version an.

Abbildung 2: Mit “hg diff dateiname” zeigen Sie die Dateiänderungen gegenüber der letzten archivierten Version an.

Über den Parameter -r (revision) können Sie auch gezielt mehrere eingecheckte Versionen vergleichen. Verschaffen Sie sich dazu zunächst mit hg log einen Überblick über alle vorhandenen Versionen – die Versionsnummern werden ab 0 durchgezählt und beziehen sich nicht auf einzelne Dateien, sondern auf das ganze Repository. Verwalten Sie in einem Ordner mehrere Dateien mit Mercurial, kann es also sein, dass zwischen zwei unterschiedlichen Versionen einer Datei mehrere Revisionsnummern liegen, die keine Änderung für diese Datei ausweisen. In der Ausgabe von hg log haben die Revisionsnummern immer die längere Form 2:8a2857b9360a, wobei der Teil nach dem Doppelpunkt ein Hash-Wert ist (Abbildung 3). Für den Vergleich von zwei Versionen reichen die vor dem Doppelpunkt stehenden Revisionsnummern. Mit

hg diff -r 1:2

vergleichen Sie Revision 1 mit Revision 2 – die Ausgabe beschreibt dann, welche Änderungen an Revision 1 gemacht wurden, um zu Revision 2 zu gelangen. Sie können die Reihenfolge auch vertauschen (also hg diff -r 2:1 schreiben), dann sehen Sie die “inversen” Änderungen: das sind diejenigen, über die sich die Änderung rückgängig machen ließe.

Abbildung 3: Über "hg log" sehen Sie die Historie des Repositorys.

Abbildung 3: Über “hg log” sehen Sie die Historie des Repositorys.

Dass es bei den Revisionen immer ums ganze Repository geht, merken Sie spätestens dann, wenn Sie versuchen, eine einzelne Datei in älterer Fassung auszuchecken – das ist so nicht möglich; stattdessen können Sie das ganze Repository auf den Stand einer früheren Version zurücksetzen, etwa mit hg checkout -r 0 für die allererste Version. Nach dem Auschecken einer älteren Fassung des Repositories können Sie z. B. die interessanten Dateien in einen anderen Ordner kopieren und dann wieder die letzte Fassung (im folgenden Beispiel: Revision 3) wiederherstellen.

$ hg co -r 0
1 Dateien aktualisiert, 0 Dateien zusammengeführt, 1 Dateien entfernt, 0 Dateien ungelöst
$ cp datei1.txt /tmp/
$ hg co -r 3
2 Dateien aktualisiert, 0 Dateien zusammengeführt, 0 Dateien entfernt, 0 Dateien ungelöst

Vergessen Sie das Wiederherstellen und arbeiten mit den (veralteten) Dateien weiter, erzeugen Sie bei der nächsten Commit- bzw. Check-in-Operation einen neuen “Zweig”: Damit entsteht ein neuer Nachfolger einer älteren Revision, und die Revisionen im Repository folgen nicht mehr linear aufeinander.

Baumstruktur

Manchmal ist eine solche Vorgehensweise sinnvoll. Wenn Software-Entwickler mit der Arbeit an einer neuen Version beginnen, gleichzeitig aber noch gelegentlich Fehlerpatches für eine alte Fassung erstellen, arbeiten sie mit solchen Verzweigungen. In Abbildung 3 ist Revision 6 eine solche Verzweigung; ihr Protokolleintrag enthält darum auch einen Verweis auf die Revision, von der sie abgeleitet ist (Vorgänger: 1:…).

Wenn mehrere Anwender gleichzeitig dieselbe Revision einer Datei (separat) bearbeiten und dann mit ihren jeweils eigenen Änderungen wieder in das Repository einchecken, entsteht auch eine solche Verzweigung. Damit nicht die Änderungen des einen Anwenders jene des anderen zunichte machen, gibt es eine “Merge” (Zusammenfügen) genannte Operation, über die sich die getrennten Änderungen kombinieren lassen. Das ist aber bereits ein Profi-Feature, und dafür verweisen wir auf Dokumentation im Netz, z. B. den Abschnitt zu “Merge” im offiziellen deutschen Mercurial-Tutorial [5] oder auf einen Artikel in unserer Schwesterzeitschrift LinuxUser [6].

GUI: TortoiseHg

Mit TortoiseHg [7] steht auch ein GUI-Tool für die Repository-Verwaltung zur Verfügung – Kubuntu-Anwender können dieses einfach über apt-get install tortoisehg kdiff3 einrichten, während OpenSuse-Benutzer zunächst ein Repository zur Liste der Paketquellen hinzufügen müssen; über software.opensuse.org ist das auch per One-Click-Installation möglich [4]. Ergänzend auch kdiff3 zu installieren, ist sinnvoll, weil das GUI-Tool keinen eigenen Viewer zum Anzeigen von Versionsunterschieden besitzt (Abbildung 4). Wenn Sie TortoiseHg in einem Ordner, der Mercurial-Revisionen enthält, starten, erscheint direkt eine Übersicht der hier verwalteten Dateien.

Abbildung 4: Für GUI-Freunde sind TortoiseHg und KDiff3 ein gutes Team – hier unter Kubuntu.

Abbildung 4: Für GUI-Freunde sind TortoiseHg und KDiff3 ein gutes Team – hier unter Kubuntu.

Alternativ bietet auch Mercurial selbst eine komfortablere Alternative für den Zugriff auf das Repository: Wenn Sie hg serve aufrufen, startet das Tool einen Webserver auf Port 8000 – rufen Sie dann im Browser http://localhost:8000/ auf, können Sie über die generierte Webseite Informationen über das Repository abrufen.

Übrigens: Neben Textdateien können Sie auch Binärdateien in Repositorys speichern, allerdings funktioniert dann der informative Versionsvergleich mit diff nicht – statt einer Zusammenfassung der Änderungen erscheint dann nur der Hinweis, dass die binären Dateien sich unterscheiden, und auch das Speichern mehrerer Versionen wird weniger effizient.

Infos

[1] Subversion: https://subversion.apache.org/

[2] Artikel zu Subversion und KDEsvn: Hans-Georg Eßer, “Kleine Unterschiede”, EasyLinux 01/2013, S. 44 ff., http://linux-community.de/28132

[3] Mercurial: http://mercurial.selenic.com/

[4] Mercurial-One-Click-Installation für OpenSuse: http://software.opensuse.org/package/tortoisehg

[5] Deutsches Mercurial-Tutorial: http://mercurial.selenic.com/wiki/GermanTutorial

[6] Mercurial-Artikel: Tim Schürmann, “Auf den Zweig gekommen”, LinuxUser 05/2014, S. 74 ff.

[7] TortoiseHg: http://tortoisehg.bitbucket.org/

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
EasyLinux 01/2015 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben