web-dev-qa-db-fra.com

Comment récupérer le hash pour le commit en cours dans Git?

Je souhaite conserver (pour le moment) la possibilité de lier les ensembles de modifications Git aux éléments de travail stockés dans TFS.

J'ai déjà écrit un outil (à l'aide d'un crochet de Git) dans lequel je peux injecter des identificateurs de travail dans le message d'un ensemble de modifications Git.

Cependant, je souhaiterais également stocker l'identifiant de la validation Git (le hachage) dans un champ de travail TFS personnalisé. De cette façon, je peux examiner un élément de travail dans TFS et voir quels jeux de modifications Git sont associés à l'élément de travail.

Comment puis-je récupérer facilement le hachage du commit actuel de Git?

1728
Sardaukar

Pour transformer une référence d'objet étendu arbitraire en SHA-1, utilisez simplement git-rev-parse, par exemple

git rev-parse HEAD

ou

git rev-parse --verify HEAD

Sidenote: Si vous souhaitez activer des références (() branches et balises ) dans SHA-1, il y a git show-ref et git for-each-ref.

2520
Jakub Narębski

Si vous voulez seulement le hachage raccourci:

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

De plus, utiliser% H est un autre moyen d’obtenir le hachage long.

395
outofculture

Un autre, en utilisant git log:

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

C'est très similaire à la @outofculture mais un peu plus court.

137
Paul Pladijs

Pour obtenir le SHA complet:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

Pour obtenir la version abrégée:

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

Pour être complet, personne ne l’a encore suggéré. .git/refs/heads/master est un fichier contenant une seule ligne: le hachage de la dernière validation sur master. Donc, vous pouvez simplement le lire à partir de là.

Ou, en tant que commande:

cat .git/refs/heads/master

Mise à jour:

Notez que git prend désormais en charge le stockage de références de têtes dans le fichier pack-ref plutôt que sous forme de fichier dans le dossier/refs/heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

64
Deestan

Il y a toujours git describe également. Par défaut, cela vous donne -

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
48
John Tyree

Commit hash

git show -s --format=%H

Hachage de validation abrégé

git show -s --format=%h

Cliquez ici pour plus d'exemples git show.

42
ecwpz91

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

28
Robert Munteanu

Si vous devez stocker le hachage dans une variable pendant un script, vous pouvez utiliser

last_commit=$(git rev-parse HEAD)

Ou, si vous ne voulez que les 10 premiers caractères (comme le fait github.com)

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

La manière la plus succincte que je connaisse:

git show --pretty=%h 

Si vous voulez un nombre spécifique de chiffres du hachage, vous pouvez ajouter:

--abbrev=n
14
Brian Peterson

Vous voulez peut-être un alias pour ne pas avoir à vous rappeler tous les détails astucieux. Après l’une des étapes ci-dessous, vous pourrez simplement taper:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

Pour faire suite à la réponse acceptée , il existe deux façons de la configurer:

1) Enseigner à git de manière explicite en éditant la configuration globale (ma réponse originale):

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

2) Ou si vous aimez un raccourci pour apprendre à Git un raccourci, comme l'a récemment commenté Adrien:

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

A partir de là, utilisez git lastcommit pour afficher le hachage du dernier commit.

13
miraculixx

Si vous voulez la façon super-hacky de le faire:

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

Fondamentalement, git stocke l'emplacement de HEAD dans .git/HEAD, sous la forme ref: {path from .git}. Cette commande lit cela, coupe le "ref:" et lit le fichier sur lequel il pointe.

Ceci, bien sûr, échouera en mode tête détachée, car HEAD ne sera pas "ref: ...", mais le hash lui-même - mais vous savez, je ne pense pas que vous attendiez cela beaucoup d'intelligence dans votre one-liners bash. Si vous ne pensez pas que les points-virgules trichent, cependant ...

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

J'avais besoin de quelque chose d'un peu plus différent: affiche le sha1 complet du commit, mais ajoute un astérisque à la fin si le répertoire de travail n'est pas propre. À moins que je ne veuille utiliser plusieurs commandes, aucune des options des réponses précédentes ne fonctionne.

Voici le liner qui fait:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Résultat: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

Explication: décrit (à l'aide de balises annotées) la validation en cours, mais uniquement avec des balises contenant "NOT A TAG". Comme les balises ne peuvent pas avoir d'espaces, cela ne correspond jamais à une balise et puisque nous voulons montrer un résultat --always, la commande affiche en arrière le plein (--abbrev=0) sha1 du commit et il ajoute un astérisque si le le répertoire de travail est --dirty.

Si vous ne souhaitez pas ajouter l'astérisque, cela fonctionne comme toutes les autres commandes des réponses précédentes:
git describe --always --abbrev=0 --match "NOT A TAG"
Résultat: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

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

Si vous visez la vitesse, l'approche mentionnée par Deestan

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

est nettement plus rapide que toute autre méthode répertoriée ici jusqu'à présent.

6
Dennis

Voici one-liner dans Bash Shell utilisant la lecture directe à partir de fichiers git:

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

Vous devez exécuter la commande ci-dessus dans votre dossier racine git.

Cette méthode peut être utile lorsque vous avez des fichiers de référentiel, mais que la commande git n'a pas été installée.

Si cela ne fonctionne pas, vérifiez dans le dossier .git/refs/heads quel type de têtes vous avez présent.

6
kenorb

dans votre répertoire personnel dans le fichier ".gitconfig", ajoutez ce qui suit

[alias]
sha = rev-parse HEAD

alors vous aurez une commande plus facile à retenir:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
3
jo_

Voici une autre façon de le faire avec :)

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

Voici une autre implémentation à accès direct:

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

Cela fonctionne également sur http, ce qui est utile pour les archives de paquets locaux (je sais: pour les sites Web publics, il n'est pas recommandé de rendre le répertoire .git accessible):

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