it-swarm.com.de

Wie rufe ich den Hash für das aktuelle Commit in Git ab?

Ich möchte (vorerst) die Möglichkeit behalten, Git-Changesets mit in TFS gespeicherten Workitems zu verknüpfen.

Ich habe bereits ein Tool (mit einem Hook von Git) geschrieben, mit dem ich Workitemidentifiers in die Nachricht eines Git-Changesets einfügen kann.

Ich möchte jedoch auch die Kennung des Git-Commits (den Hash) in einem benutzerdefinierten TFS-Workitem-Feld speichern. Auf diese Weise kann ich ein Workitem in TFS untersuchen und feststellen, welche Git-Changesets mit dem Workitem verknüpft sind.

Wie kann ich den Hash einfach aus dem aktuellen Commit von Git abrufen?

1728
Sardaukar

Um eine beliebige erweiterte Objektreferenz in SHA-1 umzuwandeln, verwenden Sie zum Beispiel einfach git-rev-parse

git rev-parse HEAD

oder

git rev-parse --verify HEAD

Randnotiz: Wenn Sie Referenzen drehen möchten ( verzweigt und Tags in SHA-1, es gibt git show-ref und git for-each-ref.

2520
Jakub Narębski

Wenn Sie nur den verkürzten Hash wollen:

git log --pretty=format:'%h' -n 1

Die Verwendung von% H ist ein weiterer Weg, um den langen Hash zu erhalten.

395
outofculture

Ein anderes mit git log:

git log -1 --format="%H"

Es ist dem von @outofculture sehr ähnlich, allerdings etwas kürzer.

137
Paul Pladijs

So erhalten Sie die vollständige SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

So erhalten Sie die gekürzte Version:

$ git rev-parse --short HEAD
cbf1b9a
93
Alexander

Der Vollständigkeit halber, da noch niemand darauf hingewiesen hat. .git/refs/heads/master ist eine Datei, die nur eine Zeile enthält: den Hash des letzten Commits für master. Man könnte es also einfach von dort aus lesen.

Oder als Befehl:

cat .git/refs/heads/master

Aktualisieren:

Beachten Sie, dass Git jetzt das Speichern einiger Kopfreferenzen in der pack-ref-Datei anstelle einer Datei im Ordner/refs/heads/unterstützt. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

64
Deestan

Es gibt immer auch git describe. Standardmäßig gibt es Ihnen -

[email protected]:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
48
John Tyree

Hash festschreiben

git show -s --format=%H

Abgekürzter Commit-Hash

git show -s --format=%h

Klicken Sie auf hier für weitere git show Beispiele.

42
ecwpz91

Benutze git rev-list --max-count=1 HEAD

28
Robert Munteanu

Wenn Sie den Hash während eines Skripts in einer Variablen speichern müssen, können Sie verwenden

last_commit=$(git rev-parse HEAD)

Oder, wenn Sie nur die ersten 10 Zeichen haben möchten (wie bei github.com)

last_commit=$(git rev-parse HEAD | cut -c1-10) 
20
Henk

Der prägnanteste Weg, den ich kenne:

git show --pretty=%h 

Wenn Sie eine bestimmte Anzahl von Ziffern des Hashs möchten, können Sie Folgendes hinzufügen:

--abbrev=n
14
Brian Peterson

Vielleicht möchten Sie einen Alias, damit Sie sich nicht alle Details merken müssen. Nachdem Sie einen der folgenden Schritte ausgeführt haben, können Sie einfach Folgendes eingeben:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

Wenn Sie die akzeptierte Antwort weiterverfolgen, haben Sie zwei Möglichkeiten, dies einzurichten:

1) Bringe git den expliziten Weg bei, indem du die globale Konfiguration editierst (meine ursprüngliche Antwort):

 # open the git config editor
 $ git config --global --edit
 # in the alias section, add
 ...
 [alias]
   lastcommit = rev-parse HEAD
 ...

2) Oder wenn Sie eine Verknüpfung möchten, um git eine Verknüpfung beizubringen, wie kürzlich von Adrien kommentiert:

$ git config --global alias.lastcommit "rev-parse HEAD"

Verwenden Sie ab hier git lastcommit, um den Hash des letzten Commits anzuzeigen.

13
miraculixx

Wenn Sie die supergeile Art und Weise wollen, es zu tun:

cat .git/`cat .git/HEAD | cut -d \  -f 2`

Grundsätzlich speichert git den Speicherort von HEAD in .git/HEAD in der Form ref: {path from .git}. Dieser Befehl liest das aus, schneidet das "ref:" ab und liest die Datei aus, auf die er zeigt.

Dies wird natürlich im Einzelkopfmodus fehlschlagen, da HEAD nicht "ref: ..." ist, sondern der Hash selbst - aber Sie wissen, ich glaube nicht, dass Sie das erwarten viel schlauer in Ihrem bash Einzeiler. Wenn Sie nicht glauben, dass Semikolons schummeln ...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
11
Fordi

Ich brauchte etwas anderes: zeige den vollen sha1 des Commits an, füge aber einen Stern an das Ende an, wenn das Arbeitsverzeichnis nicht sauber ist. Sofern ich nicht mehrere Befehle verwenden wollte, funktioniert keine der Optionen in den vorherigen Antworten.

Hier ist der eine Liner, der das macht:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Ergebnis: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

Erläuterung: Beschreibt (unter Verwendung kommentierter Tags) das aktuelle Commit, jedoch nur mit Tags, die "NOT A TAG" enthalten. Da Tags keine Leerzeichen enthalten können, stimmt dies nie mit einem Tag überein. Da das Ergebnis --always angezeigt werden soll, wird beim Zurücksetzen des Befehls die vollständige (--abbrev=0) sha1 des Commits angezeigt und ein Sternchen angehängt, wenn das Arbeitsverzeichnis ist --dirty.

Wenn Sie das Sternchen nicht anhängen möchten, funktioniert dies wie bei allen anderen Befehlen in den vorherigen Antworten:
git describe --always --abbrev=0 --match "NOT A TAG"
Ergebnis: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

9
Rado
git show-ref --head --hash head

Wenn Sie jedoch auf Geschwindigkeit setzen, ist der von Deestan erwähnte Ansatz

cat .git/refs/heads/<branch-name>

ist deutlich schneller als jede andere hier bisher aufgeführte Methode.

6
Dennis

Hier ist ein Einzeiler in Bash Shell, der das direkte Lesen von Git-Dateien verwendet:

(head=($(<.git/HEAD)); cat .git/${head[1]})

Sie müssen den obigen Befehl in Ihrem Git-Stammordner ausführen.

Diese Methode kann nützlich sein, wenn Sie Repository-Dateien haben, der Befehl git jedoch nicht installiert wurde.

Wenn dies nicht funktioniert, überprüfen Sie im Ordner .git/refs/heads, welche Art von Köpfen Sie vorhanden haben.

6
kenorb

fügen Sie in Ihrem Home-Verzeichnis in der Datei ".gitconfig" Folgendes hinzu

[alias]
sha = rev-parse HEAD

dann haben Sie einen einfacheren Befehl, an den Sie sich erinnern können:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
3
jo_

Hier ist eine andere Möglichkeit, es mit :) zu tun

git log | grep -o '\w\{8,\}' | head -n 1
0

Hier ist eine weitere Direktzugriffsimplementierung:

head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(cat ".git/${head#ref: }")"
done

Dies funktioniert auch über http, was für lokale Paketarchive nützlich ist (ich weiß: Für öffentliche Websites wird nicht empfohlen, das .git-Verzeichnis zugänglich zu machen):

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
0
Daniel Alder