2010-03-21 7 views
97

Gibt es einen besseren Weg, um die aktuelle Revision Hash in Mercurial alsDrucken Aktuelle Mercurial Revision Hash?

hg log -l1|grep changeset|cut -d: -f3

extrahieren?

Ein Teil meines Webapp-Deployment-Skripts "markiert" das hochgeladene App-Tarball mit seinem eindeutigen Revisions-Hash.

+1

Beachten Sie, dass 'hg log -l 1' Ihnen den letzten Änderungssatz anzeigt, nicht unbedingt den, auf den Sie gerade aktualisiert werden!Das Flag -f beschränkt die Ausgabe des Hg-Logs auf die Vorfahren des aktuellen Arbeitsverzeichnisses, so dass 'hg log -f -l1' näher bei dem ist, was Sie wollen. – waterproof

Antwort

165

Versuchen:

hg id -i 

Beispiel:

$ hg id -i 
adc56745e928 
+17

Bei Menschen vermissen die Lösungen unten, wenn Sie den vollständigen Hash verwenden möchten: 'hg --debug id -i' wenn Sie Template-Unterstützung Verwendung' hg Mutter --template ‚{node}‘ '' nicht verwenden hg protokollieren wollen - l 1, das neueste Repository-Änderungsset, nicht das aktuelle Änderungsset der Arbeitskopie. –

+7

Die Verwendung von --debug in Skripten wird nicht empfohlen, diese Ausgabe wird weniger sorgfältig mit Abwärtskompatibilität gesteuert. Benutze die Vorlage. Wenn Sie es mit Protokoll machen wollen, dann benutzen Sie '.' dot als Revision. –

+0

Danke Ry4an Ich hatte keine Ahnung von "-r." Referenzieren der aktuellen Überarbeitung der Arbeitskopie. Das scheint der bessere Schritt zu sein, als von "log" zu "parent" zu wechseln. –

7
hg log -l 1 --template '{node|short}\n' 

Siehe the docs Absätze „Die Grundlagen der Templat“ und folgende.

+2

Ich wollte fast das, aber mit dem langen Hash. Aliasing 'lid' to' log -l 1 --template '{node} \ n'' erreicht genau dies - drucke die vollständige Revision ID. –

+6

Dies druckt das zuletzt gezogene Änderungsset. Unser Arbeitsverzeichnis könnte auf ein älteres Änderungsset aktualisiert werden. Um den Änderungssatz zu drucken, auf den wir aktualisiert werden, verwenden Sie "hg id". Das einzige Problem ist, dass "hg id" keine Templates unterstützt und auch keine Möglichkeit hat, lange Hashs zu drucken (es sei denn, jemand weiß, wie das geht). – Eiver

+1

Wie Eiver sagte, druckt das nicht die tatsächliche Revision in Ihrer Arbeitskopie nur die neueste in Ihrem Repository. Da die Verwendung dieser Lösung zu Tracking-Fehlern führen kann, habe ich diese Lösung abgelehnt. –

35
hg --debug id -i 

Dies wird Ausgang der langen Hash mit einem Plus, wenn es unbestätigten Änderungen sind.

+0

, dass der Standard in 3.1.2 – nickd

+1

Downvoting wegen Ry4an des [Kommentar] (http://stackoverflow.com/questions/2485651/print-current-mercurial-revision-hash#comment14377031_2485923) zu sein scheint. –

16

Sie können mit dem übergeordneten Befehl --template, ich benutze diese die lange Hash zu bekommen:

hg parent --template '{node}' 
+0

Die hg Manpage sagt 'hg parents' ist [DEPRECATED] (https://www.selenic.com/mercurial/hg.1.html#parents), obwohl vielleicht könnte dies nicht der Fall gewesen sein, wenn Sie diese Antwort schrieb . Wenn es eine nicht festgeschriebene Zusammenführung gibt, gibt es [zwei übergeordnete Revisionen] (https://www.mercurial-scm.org/wiki/UnderstandingMercurial#line-157). –

+0

Kann uns jemand sagen, warum hg Eltern veraltet sind und was sollten wir stattdessen verwenden? – Vincent

12

die Antworten und ihre Antworten zusammenfassend, so scheint es, dass diese der beste Weg ist, die drucken einzigartige (nicht Kurzform) Kennung der aktuellen Version:

hg log -l 1 --template '{node}\n' -r . 
+0

Hinweis, wenn es eine [uncommitted merge] (https://www.mercurial-scm.org/wiki/UnderstandingMercurial#line-157), der '.' (dot) zeigt nur das [erste parent] (https:// www.selenic.com/hg/help/revisions) von zwei Eltern der Arbeitsgruppe. –

+0

Brauchen Sie das '-l 1'? Scheint ohne es zu arbeiten. – aaaidan

2

der spezifische nicht-DEPRECATED Befehl whi ch aufgrund der Anwesenheit von --template kann nur Revisionsinformationen drucken, wenn die Prägnanz erforderlich ist (wie durch die Frage impliziert):

hg log -l 1 -b . -T '{rev}:{node|short}\n'

Oder einzigartige lange Form von hash:

hg log -l 1 -r . -T '{node}\n'

Die -b . oder branch(.) (Punkt für Zweigname) means the current working directory branch und -r . bedeutet die aktuelle Arbeitsverzeichnis Revision, die documented in hg help revsets ist nd hg help revisions.

Hinweis: Wenn es eine uncommitted merge gibt, zeigt die . (Punkt) nur die first parent von zwei Eltern der Arbeitsgruppe an.

0

Wie andere darauf hingewiesen haben, verwenden Sie nicht log -l.

Verwenden Sie hg log -r ., um detaillierte Informationen zu erhalten, im Gegensatz zur Verwendung von hg id, deren Ausgabe begrenzt ist und keine Vorlagen unterstützt. Sie könnten auch einen kleinen Alias ​​wie here = log -r . erstellen und hg here verwenden. Wenn Sie nur den Hash verwenden möchten, verwenden Sie hg log -r . --template '{node}\n'.

Verwandte Themen