Wie finde ich den Hash des Zweigs in Git?

91

Wie kann ich bei einem lokalen / Remote-Zweigstellennamen den Hash des Commits erhalten, auf den dieser Zweig verweist?

Mischa Moroshko
quelle

Antworten:

147

Der Befehl git rev-parseist dein Freund, zB:

$ git rev-parse development
17f2303133734f4b9a9aacfe52209e04ec11aff4

... oder für einen Remote-Tracking-Zweig:

$ git rev-parse origin/master
da1ec1472c108f52d4256049fe1f674af69e785d

Dieser Befehl ist im Allgemeinen sehr nützlich, da er alle Arten der Angabe von Zweignamen analysieren kann git, z. B.:

git rev-parse master~3
git rev-parse HEAD@{2.days.ago}

... usw.

Mark Longair
quelle
Wie kann der gesamte Commit-Hash einer lokalen Niederlassung angezeigt werden?
Mahdi
1
@ Kenji: Sie sollten wahrscheinlich eine neue Frage dafür erstellen, aber wenn Sie nur die Hashes jedes Commits in einem Zweig möchten foo, können Sie Folgendes tun:git log --pretty=format:'%H'
Mark Longair
Wenn ich die nächste Zeile in JenkinsFile führe: def BranchHash = sh "git rev-parse ${BRANCH-NAME}Ich bekomme : fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.. Was ist falsch?
Arielma
5

Die Hashes werden unter .git/refs/z.git/refs/heads/master

Verwenden Sie es jedoch programmatisch, git rev-parsewie von Mark Longair vorgeschlagen, da es sicherer ist.

Mark Fisher
quelle
2

Vergessen Sie nicht, dass Git seit Git 2.19 (Q2 2018) einen Übergang von SHA1-Hashes zu SHA2 vorbereitet: siehe " Warum verwendet Git kein moderneres SHA? "

Mit Git 2.25 (Q1 2020), git rev-parseEntwickelt und reflektiert diesen möglichen neuen Hash.

Sehen Sie verpflichten fa26d5e , begehen cf02be8 , begehen 38ee26b , begehen 37ab8eb , begehen 0370b35 , begehen 0253e12 , begehen 45e2ef2 , begehen 79b0edc , begehen 840624f , begehen 32a6707 , begehen 440bf91 , begehen 0b408ca , begehen 2eabd38 (28. Oktober 2019), und verpflichten 1bcef51 , verpflichten ecde49b ( 05.10.2019 ) von brian m. Carlson ( bk2204) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 28014c1, 10. November 2019)

rev-parse: --show-object-formatOption hinzufügen

Unterzeichnet von: brian m. Carlson

Fügen Sie eine Option zum Drucken des Objektformats hinzu, das für die Eingabe, Ausgabe oder Speicherung verwendet wird.
Auf diese Weise können Shell-Skripte den verwendeten Hash-Algorithmus ermitteln.

Da der Übergangsplan mehrere Eingabealgorithmen zulässt, dokumentieren Sie, dass wir möglicherweise mehrere Ergebnisse für die Eingabe bereitstellen, und das Format, das die Ergebnisse annehmen können.
Obwohl wir dies derzeit nicht unterstützen, bedeutet eine frühzeitige Dokumentation, dass Skriptautoren ihre Skripte zukunftssicher machen können, wenn wir dies tun.

Die git rev-parseDokumentation enthält jetzt:

--show-object-format[=(storage|input|output)]:

Zeigen Sie das Objektformat (Hash-Algorithmus) an, das für das Repository zur Speicherung im .gitVerzeichnis, in der Eingabe oder in der Ausgabe verwendet wird. Zur Eingabe können mehrere Algorithmen gedruckt werden, die durch Leerzeichen getrennt sind. Wenn nicht angegeben, ist der Standard "Speicher".


Mit Git 2.29 (Q4 2020) können Sie sicherstellen, welches Format Sie zum Lesen des Hash-Commits eines Zweigs (oder eines anderen Objekts) verwenden müssen.

Sehen Sie verpflichten e023ff0 , begehen 4feb562 , begehen 8a06d56 , begehen c49fe07 , begehen 02a32db , begehen ceaa4b3 , begehen eff45da , begehen b5b46d7 , begehen c5aecfc , begehen e74b606 , begehen 439d3a1 , begehen 6c2adf8 , begehen de5737c , begehen e0a646e , begehen 6ff6a67 , begehen 831279d , verpflichten b6e5005 , Commit 287bb3a , Commit 22f1824 , Commit db00af9 ,commit 7187eb1 , commit 98de0b2 , commit a5587b8 , commit 66b6d43 , commit 2197f87 , commit c0b65ea , commit d62607d , commit d482c23 , commit 866be6e , commit 4bacb6d , commit 252a4ee , commit 368f3cb , commit abe3db1 , commit 08fbc5d , commit 11b6961 , commit 9e3bd8a , commit d827bce , Commit 094a685 (29. Juli 2020) von Brian M. Carlson ( bk2204) .
SehenCommit 800e6a7 (29. Juli 2020) von Johannes Schindelin ( dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit e0ad957 , 11. August 2020)

docs: Dokumentation hinzufügen für extensions.objectFormat

Unterzeichnet von: brian m. carlson
Bewertet von: Eric Sunshine

Dokumentieren Sie die extensions.objectFormatKonfigurationseinstellung.
Warnen Sie Benutzer, es nicht selbst zu ändern.

git configenthält jetzt in seiner Manpage :

extensions.objectFormat

Geben Sie den zu verwendenden Hash-Algorithmus an.

Die akzeptablen Werte sind sha1und> sha256.
Wenn nicht angegeben, sha1wird angenommen.
Es ist ein Fehler, diesen Schlüssel anzugeben, es sei denn, er core.repositoryFormatVersionist 1.

Beachten Sie, dass diese Einstellung nur von git initoder festgelegt werden sollte git clone.
Der Versuch, es nach der Initialisierung zu ändern, funktioniert nicht und führt zu schwer zu diagnostizierenden Problemen.


Mit Git 2.29 (Q4 2020) wird die kürzlich hinzugefügte SHA-256-Unterstützung in der Dokumentation als experimentell markiert .

Siehe Commit ff233d8 (16. August 2020) von Martin Ågren ( none) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit d1ff741 , 24. August 2020)

Documentation: --object-format=sha256als experimentell markieren

Unterzeichnet von: Martin Ågren

Nach eff45daab8 (" repository: Standardmäßig SHA-256-Unterstützung aktivieren", 2020-07-29, Git v2.29.0 - Zusammenführung in Stapel 6 aufgeführt ) ermöglichen Vanilla-Builds von Git dem Benutzer die Ausführung, z.

git init --object-format=sha256  

und hacken weg.
Dies kann ein guter Weg sein, um Erfahrungen mit der SHA-256-Welt zu sammeln, z. B. um Fehler zu finden, die

GIT_TEST_DEFAULT_HASH=sha256 make test  

nicht erkennen.

Aber es ist wirklich eine separate Welt: Solche SHA-256-Repos werden völlig getrennt von der (inzwischen ziemlich großen) Menge von SHA-1-Repos leben.
Eine grenzüberschreitende Interaktion ist grundsätzlich möglich, z. B. über " diff+ apply" (oder " format-patch+ am"), aber auch das hat seine Grenzen: Das Anwenden eines SHA-256-Diff in einem SHA-1-Repo funktioniert im einfachen Fall, aber wenn Sie müssen zurückgreifen-3 , Sie haben kein Glück.

Ebenso sollte " push+ pull" funktionieren, aber Sie werden wirklich größtenteils vom Rest der Welt versetzt arbeiten. Das könnte in Ordnung sein, wenn Sie Ihr Repository initialisieren, und es könnte einige Monate danach in [Ordnung sein , aber es könnte ein Tag kommen, an dem Sie anfangen, Ihre Verwendung von git init --object-format = sha256 zu bereuen ](https://github.com/git/git/blob/ff233d8dda12657a90d378f2b403bc6c85838c59/Documentation/git-init.txt#L52)<sup>([man](https://git-scm.com/docs/git-init#Documentation/git-init.txt---object-formatltformatgt))</sup>und haben grub dich in ein ziemlich tiefes Loch.

Derzeit sind Themen im Flug, um unsere Datenformate und Protokolle in Bezug auf SHA-256 zu dokumentieren. In einigen Fällen (Midx und Commit-Graph) erwägen wir, anzupassen, wie die Dateiformate angeben, welches Objektformat verwendet werden soll.

Wo --object-formatimmer in unserer Dokumentation erwähnt, machen wir deutlich, dass die Verwendung mit "sha256" experimentell ist.
Wenn wir später erklären müssen, warum wir nicht mit Daten umgehen können, die wir im Jahr 2020 generiert haben, können wir immer auf diesen Absatz verweisen, den wir hier hinzufügen.

Durch "include ::" - einen kleinen Klappentext sollten wir in der Lage sein, in der gesamten Dokumentation konsistent zu sein und schließlich den Schweregrad dieses Textes schrittweise zu verringern.
Eines Tages könnten wir es sogar nutzen, um mit dem Auslaufen zu beginnen --object-format=sha1, aber lasst uns nicht weiterkommen ...

Es gibt auch extensions.objectFormat, aber es wird nur dreimal erwähnt. Zweimal, wo wir diesen neuen Haftungsausschluss hinzufügen, und an dritter Stelle haben wir bereits eine Warnung "Nicht bearbeiten". Von dort aus sollten interessierte Leser schließlich diese neue finden, die wir hier hinzufügen.

Da dies GIT_DEFAULT_HASHein weiterer Einstiegspunkt für diese Funktionalität ist, dokumentieren Sie auch deren experimentellen Charakter.

gitenthält jetzt in seiner Manpage :

wird stattdessen verwendet. Der Standardwert ist "sha1". DIESE VARIABL IST EXPERIMENTELL! Siehe --object-formatin git init.

object-format-disclaimerenthält jetzt in seiner Manpage :

Diese Option ist experimentell!
Die SHA-256-Unterstützung ist experimentell und befindet sich noch in einem frühen Stadium.

Ein SHA-256-Repository kann im Allgemeinen keine Arbeit mit "normalen" SHA-1-Repositorys teilen.
Es sollte angenommen werden, dass sich beispielsweise Git-interne Dateiformate in Bezug auf SHA-256-Repositorys auf abwärtskompatible Weise ändern können.
Nur --object-format=sha256zu Testzwecken verwenden.


Das gleiche Git 2.29 (Q4 2020) stellen sicher, dass "git clone " ( man ) funktioniert, wenn man aus dem SHA-1-Repository klont, während GIT_DEFAULT_HASHSHA-256 bereits verwendet wird.
Vor 2.29 führte dies zu einem unbrauchbaren Repository, das zur Hälfte behauptet, SHA-256-Repository mit SHA-1-Objekten und -Referenzen zu sein.
Dies wurde korrigiert.

Siehe Commit 47ac970 (20. September 2020) von Brian M. Carlson ( bk2204) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit B28919c , 29. September 2020)

builtin/clone: Vermeiden Sie Fehler mit GIT_DEFAULT_HASH

Berichtet von: Matheus Tavares
Unterzeichnet von: brian m. Carlson

Wenn ein Benutzer ein SHA-1-Repository mit klont GIT_DEFAULT_HASH Wert " sha256" klont, kann dies zu einem Repository führen, dessen Repository-Formatversion 0 ist, dessen extensions.objectformatSchlüssel jedoch auf " sha256" gesetzt ist.
Dies ist sowohl falsch (der Benutzer hat ein SHA-1-Repository) als auch nicht funktionsfähig (da die Erweiterung nicht in einem v0-Repository verwendet werden kann).

Dies liegt daran, dass wir in einem Klon zunächst das Repository einrichten und dann seinen Algorithmus basierend auf den Angaben der Remote-Seite ändern.
In diesem Fall haben wir das Repository zunächst als SHA-256 eingerichtet und später die Repository-Version zurückgesetzt, ohne die Erweiterung zu löschen.

Wir könnten in diesem Fall einfach immer die Erweiterung festlegen, aber das würde bedeuten, dass unsere SHA-1-Repositorys nicht mit älteren Git-Versionen kompatibel sind, obwohl es keinen Grund gibt, warum dies nicht der Fall sein sollte.
Außerdem möchten wir das Repository zunächst nicht als SHA-1 initialisieren. Wenn wir also ein leeres Repository klonen, haben wir die GIT_DEFAULT_HASHVariable nicht berücksichtigt und erhalten am Ende kein SHA-1-Repository ein SHA-256-Repository.

Keiner von beiden ist ansprechend. Lassen Sie uns dem Repository-Initialisierungscode mitteilen, ob wir eine solche Neuinitialisierung durchführen, und in diesem Fall die Erweiterung löschen, wenn wir SHA-1 verwenden.
Dies stellt sicher, dass wir ein gültiges und funktionsfähiges Repository erstellen und keinen unserer anderen Anwendungsfälle beschädigen.

VonC
quelle