====== 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 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 Den aktuellen „patch“ (vor seiner Übergabe) kommentieren: hg qrefresh -m "Message" Einen „patch“ in eine Übergabe umwandeln: hg qfinish Ä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 # 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 # 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