Mercurial

Jan 27.10.2009, 21:44

In diesem Beitrag möchte ich Mercurial kurz vorstellen. Mercurial ist ein verteiltes Versionskontrollsystem.

Vorteile

Verteilte Versionskontrollsysteme benötigen keinen Server. Es gibt kein zentrales Repository, sondern beliebig viele, die ihre Änderungen untereinander bekannt machen (können).

Nachdem ich sehr lange dem robusten CVS treu blieb, habe ich mich gegen einen Wechsel zu Subversion entschieden und den Schwung zu Mercurial gewagt. Soviel vorweg: Bereut habe ich es bisher nicht.

Mercurial und GIT

Neben Mercurial gibt es auch GIT als verteiltes Sourcecode-Management-System (SCM). GIT wird z.B. bei der Entwicklung des Linux-Kernels eingesetzt. Aber auch Mercurial kann große Projekte wie OpenOffice vorweisen. Mercurial ist komplett in Python geschrieben, GIT in C.

Los gehts

Erstmal erstellen wir uns ein leeres Repository

hg init

Ein bestehendes Repository kann man z.B. mit

hg clone static-http://scm.openrat.de/latest

kopieren. Ach ja, mit der Eingabe von hg help <befehl> bekommt man eine Kurzhilfe zu jedem Befehl angezeigt.

Nun kann man fleißig Änderungen vornehmen: Datei anlegen, ändern, löschen. Mit hg commit checkt man das ganze ein. Dabei wird keine Änderungen durch die Weltgeschichte transportiert, alles bleibt im lokalen Repository, welches übrigens im versteckten Unterordner ".hg" schlummert.

dankert@duese:~/tmp/bla$ hg init
dankert@duese:~/tmp/bla$ echo "Meine neue Datei" > datei.txt
dankert@duese:~/tmp/bla$ hg add
Füge datei.txt hinzu
dankert@duese:~/tmp/bla$ hg commit -m "Neue Datei mit sinnlosem Text."
dankert@duese:~/tmp/bla$ hg log
Änderung: 0:ddf0902580e8
Marke: tip
Nutzer: dankert@duese
Datum: Tue Oct 27 22:08:21 2009 +0100
Zusammenfassung: Neue Datei mit sinnlosem Text.

dankert@duese:~/tmp/bla$

Jetzt wird es verteilt

Bisher war für CVS- und SVN-Anwender alles wie gewohnt, doch jetzt kommt der Clou: Wir klonen das Repository auf ein Notebook. Dazu starten wir in diesem Fall den eingebauten Webserver:

hg serve

Nun ist auf Port 8000 das Repository erreichbar. Im Browser gebt Ihr dazu einfach locahost:8000 ein.

Auf dem Notebook holen wir uns jetzt das Repository mit hg clone .=

dankert@braunbaer-laptop:~/tmp/bla$ hg clone http://172.19.12.23:8000 .
Fordere alle Änderungen an
Füge Änderungssätze hinzu
Füge Manifeste hinzu
Füge Dateiänderungen hinzu
Fügte 1 Änderungssätze mit 1 Änderungen zu 1 Dateien hinzu
Aktualisiere Arbeitsverzeichnis
1 Dateien aktualisiert, 0 Dateien zusammengeführt, 0 Dateien entfernt, 0 Dateien ungelöst

Jetzt können wir das Notebook abstöpseln und unterwegs ohne Netzzugang Datei ändern, löschen und per hg commit ins Repository aufnehmen.

dankert@braunbaer-laptop:~/tmp/bla$ echo "Noch eine Zeile" >> datei.txt
dankert@braunbaer-laptop:~/tmp/bla$ echo "Butter" > einkaufsliste.txt
dankert@braunbaer-laptop:~/tmp/bla$ hg add
Füge einkaufsliste.txt hinzu
dankert@braunbaer-laptop:~/tmp/bla$ hg commit -m "Meine Änderungen von unterwegs"
dankert@braunbaer-laptop:~/tmp/bla$

Der Merge

Wenn wir wieder zuhause sind, möchten wir die Änderungen bestimmt im eingangs erstellten Haupt-Repository bekannt machen. Dazu schauen wir mit hg pull erstmal nach, ob es etwas neues gibt. Anschließend schieben wir die Änderungen mit hg push weiter. Dazu muss auf dem Ziel-PC natürlich wieder der Server mit hg serve gestartet sein.

dankert@braunbaer-laptop:~/tmp/bla$ hg pull
Hole von http://172.19.12.23:8000
Suche nach Änderungen
Keine Änderungen gefunden

dankert@braunbaer-laptop:~/tmp/bla$ hg push
Übertrage nach http://172.19.12.23:8000
Suche nach Änderungen
ssl required

Uuups. Per Voreinstellung verlangt Mercurial nach SSL - was wir mangels Zertikat (erstmal) nicht haben und im LAN wahrscheinlich auch nicht brauchen.

Im Unterverzeichnis ".hg" gibt es die Datei "hgrc". Hier tragen wir die Zeilen

[web]
push_ssl = false
allow_push = *

ein. Nach einer Änderung muss der Server neu gestartet werden! Die Zeile "allow_push=*" erlaubt das Schreiben ins Repository. Anderenfalls würde man die Meldung "authorization failed" erhalten.

Anschließend starten wir nochmal den hg push auf dem Notebook.

dankert@braunbaer-laptop:~/tmp/bla$ hg push
Übertrage nach http://172.19.12.23:8000
Suche nach Änderungen
Füge Änderungssätze hinzu
Füge Manifeste hinzu
Füge Dateiänderungen hinzu
Fügte 1 Änderungssätze mit 2 Änderungen zu 2 Dateien hinzu
dankert@braunbaer-laptop:~/tmp/bla$

Super, das hat geklappt. Jetzt können wir im Haupt-Repository ein Update machen.

dankert@duese:~/tmp/bla$ hg up
2 Dateien aktualisiert, 0 Dateien zusammengeführt, 0 Dateien entfernt, 0 Dateien ungelöst
dankert@duese:~/tmp/bla$ ls -l
insgesamt 8
-rw-r--r-- 1 dankert dankert 33 2009-10-27 22:32 datei.txt
-rw-r--r-- 1 dankert dankert 7 2009-10-27 22:32 einkaufsliste.txt
dankert@duese:~/tmp/bla$

Fertig.

Fallstricke

Komplizierter wird es, wenn man in mehreren Repositorys Änderungen durchführt. Beim ersten Pull bzw. Push enstehen auf der Zielseite 2 sog. Köpfe, die mit hg head sichtbar sind. Nun muss man mit einem hg merge diese Änderungen zusammenführen und anschließend per hg commit bestätigen. Der Merge muss zwar nur auf einer Seite durchgeführt werden, aber bei größeren Änderungen kann das komplexer werden. Vor einem Pull oder Push sollte man darauf achten, dass das Arbeitsverzeichnis sauber ist und keine abgehenden Änderungen enthält.

Hilfsmittel

Mercurial wird von zahreichen IDEs unterstützt, z.B. gibt es für Eclipse das Plugin "MercurialEclipse".

Fazit

Mercurial ist ein klasse Hilfsmittel für den Entwickler, wenn man nicht mit einem zentralen Repository arbeiten kann oder will. Es ist robust, gut dokumentiert und bringt nach etwas Einarbeitungsaufwand viel Freude.

Ich wünsche viel Spaß mit Mercurial...