Anwendungen von Mercurial für Fortgeschrittene
Ein externes Programm zum Zusammenführen (merge) benutzen
Wenn mehrere Änderungen an einem Depot sich überlappen und das Ergebnis manuell bestimmt werden muss, kann das Programm meld
dazu verwendet werden.
Nach der Installation von meld
weist man Mercurial durch Eintragen von
[ui] merge = meld
in ~/.hgrc
an, dieses Programm zu verwenden.
Nützliche Erweiterungen
Man kann eine Erweiterung über die Datei ~/.hgrc
bekanntgeben. Die Syntax ist:
[extensions] name = adress
Einige Erweiterungen sind in Mercurial enthalten und benötigen daher keine Angabe einer Adresse, so die vier folgenden:
color In Mercurial Farben verwenden. Das kann nützlich sein, um Unterschiede zwischen Dateiversionen zu visualisieren.
hgext.fetch
Das Kommando hg fetch
als Kombination von hg pull
, hg merge
und hg update
hinzufügen.
hgext.graphlog
Das Kommando hg glog
hinzufügen, womit die Versionsverzweigung zusammen mit dem Protokoll angezeigt wird. Es wird empfohlen, den Umfang der Protokollierung mit der Option -l
(z.B.: -l 10
) einzuschränken. Die Option -p
zeigt die Einzelheiten der Unterschiede jeder Änderung.
mq
Diese Erweiterung wird nachstehend weiter erklärt. Damit kann eine „patch“-Liste des Mercurial-Depots verwaltet werden; sie bietet die Funktionen Anwenden, Anwenden rückgängig machen, Aktualisieren usw. Diese Erweiterung bietet verschiedene Befehle mit einem Namen, der meistens mit 'q' anfängt. Sucht man im Internet nach mercurial mq
, findet man zahlreiche Dokumentationsseiten.
Grundfunktionen von MQ
Anlegen eines „patch“-Depots mit Versionskontrolle in einem Mercurial-Depot; es handelt sich um ein Depot innerhalb eines Depots, in welchem die Änderungen zum „patchen“ mit Hilfe von Mercurial als solche verwaltet werden können:
hg qinit -c
Nach erfolgten Änderungen werden diese als „patch“ gesondert aufgenommen, nicht per commit
übergeben:
hg qnew <name_of_patch>
Anzeigen angewendeter und nicht angewendeter „patches“:
hg qseries -v
Änderungen zum aktuellen, gerade bearbeiteten „patch“ aufnehmen:
hg qrefresh
Anwenden des nächsten „patches“ in der Reihe:
hg qpush
Anwenden aller „patches“:
hg qpush -a
Anwenden des aktuellen „patches“ rückgängig machen:
hg qpop
Anwenden aller „patches“ rückgängig machen:
hg qpop -a
Auf einen „patch“ in der Reihe positionieren:
hg qgoto <name_of_patch>
Den aktuellen „patch“ (vor seiner Übergabe) kommentieren:
hg qrefresh -m "Message"
Einen „patch“ in eine Übergabe umwandeln:
hg qfinish <name_of_patch>
Änderungen aus dem „patch“-Depot übergeben:
hg qcommit -m "Übergabekommentar"
Hinweis: „Patches“ werden in .hg/patches
gespeichert. Die Datei .hg/patches/series
kann manuell bearbeitet werden, um die Reihenfolge der Anwendung der „patches“ zu beeinflussen. Beachten Sie aber, dass dies Probleme verursachen kann, wenn mehrere „patches“ die gleiche Datei als Ziel haben.
MQ & Merge
Grundidee
„Patches“ können leichter mit der merge-Funktion von Mercurial aktualisiert werden als von Hand. Dazu braucht man zwei Merker in dem Depot. Einer davon kümmert sich um die im Depot angewandte „patches“ an der Reihe; der andere um die neuen Übergaben, Aktualisierungen usw.:
o Neue Depotversion | | | o Patches | | | / | o Depot vor der patch-Anwendung
Die Zweig der „patches“ wird dann dem neuen Zweig hinzugefügt und MQ wird die „patches“ mit der merge-Funktion aktualisieren. Beachten Sie, dass die Verwendung eines externen Programms zum Einmischen (wie das oben vorgeschlagene meld
) absolut empfehlenswert ist.
Die „patch“-Reihe anlegen:
qpush -a hg tags # Nummer der qparent-Version merken bzw. notieren qsave -e -c # Status der „patches“ merken, da er später von merge benötigt wird. (Zahl am Ende von patches.N merken oder notieren; ist im allgemeinen 1)
Den neuen Zweig anlegen:
hg update -C <Nummer der Elternreihe qparent> # wie zuvor notiert.
# Dann, je nachdem, was zu tun ist: # Aktualisieren: hg pull -u # Neue Änderungen übergeben, Änderungen durchführen, und dann: hg commit -m "Kommentar" # Einen „patch“ editieren: hg qgoto <name_of_patch> # dann Änderung vornehmen und: hg qrefresh
Einmischen anstossen:
hg qpush -a -m
Depot bereinigen:
hg qpop -a hg qpop -a -n patches.N rm -r .hg/patches.N
Änderungen aus dem „patch“-Depot übergeben:
hg qcommit -m "Aktualisiert auf Version???"
„patch“-Reihe wieder anlegen:
hg qpush -a