Comment récupérer le hachage pour le commit courant dans Git?

j'aimerais conserver (pour l'instant) la possibilité de relier les changesets Git aux workitems stockés dans TFS.

j'ai déjà écrit un outil (en utilisant un crochet de Git) dans lequel je peux injecter des identificateurs workitemid dans le message d'un git changeset.

cependant, je voudrais aussi stocker l'identifiant du git commit (le hachage) dans un champ personnalisé TFS workitem. De cette façon, je peux examiner un workitem dans TFS et voir ce que git changesets sont associés à la workitem.

Comment puis-je récupérer facilement le hash de la propagation actuelle à partir de Git?

1461
demandé sur Daniel B 2009-06-04 12:42:51

18 réponses

pour transformer la référence d'objet étendue arbitraire en SHA-1, utilisez simplement git-rev-parse , par exemple

git rev-parse HEAD

ou

git rev-parse --verify HEAD

Note: Si vous souhaitez activer références ( branches et tags ) en SHA-1, il y a git show-ref et git for-each-ref .

2148
répondu Jakub Narębski 2015-12-13 03:25:13

si vous voulez seulement le hachage raccourci:

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

de plus, l'utilisation de %H est une autre façon d'obtenir le long hash.

336
répondu outofculture 2011-09-30 23:32:09

un autre, en utilisant git log:

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

il est très similaire à la de @outofculture bien qu'un peu plus court.

117
répondu Paul Pladijs 2011-11-21 18:48:18

Pour obtenir le plein SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

pour obtenir la version abrégée:

$ git rev-parse --short HEAD
cbf1b9a
66
répondu Alexander 2016-07-29 20:04:03

par souci d'exhaustivité, puisque personne ne l'a encore suggéré. .git/refs/heads/master est un fichier qui ne contient qu'une seule ligne: le hachage du dernier commit sur master . Donc tu pourrais le lire à partir de là.

Ou, comme la commande:

cat .git/refs/heads/master

mise à Jour:

notez que git supporte maintenant le stockage de certains ref têtes dans le fichier pack-ref au lieu d'un fichier dans le répertoire /refs/heads/ folder. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

63
répondu Deestan 2013-09-11 09:36:26

il y a toujours git describe aussi. Par défaut il vous donne --

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe 
release-0.19-11-g7a68a75
35
répondu John Tyree 2011-08-26 10:43:43

Commettre hachage

git show -s --format=%H

Abrégé de commettre hachage

git show -s --format=%h

, Cliquez sur ici pour plus d' git show exemples.

27
répondu ecwpz91 2017-03-27 19:46:59

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

25
répondu Robert Munteanu 2009-06-04 08:48:11

si vous avez besoin de stocker le hash dans une variable pendant un script, vous pouvez utiliser

last_commit=$(git rev-parse HEAD)

Ou, si vous voulez seulement les 10 premiers caractères (comme github.com n')

last_commit=$(git rev-parse HEAD | cut -c1-10) 
19
répondu Henk 2016-01-20 10:15:28

la façon la plus concise que je connaisse:

git show --pretty=%h 

si vous voulez un nombre spécifique de chiffres du hash, vous pouvez ajouter:

--abbrev=n
12
répondu Brian Peterson 2014-02-07 06:43:57

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

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

en gros, git stocke L'emplacement de HEAD in .git/de la TÊTE, dans le formulaire ref: {path from .git} . Cette commande lit, tranches large de la "ref: ", et lit ce fichier il souligné.

Ceci, bien sûr, ne va pas dans décollement de la mode, en tant que CHEF de ne pas être "ref:...", mais le hash lui - même-mais vous savez, Je ne pense pas que vous vous attendez à ce que beaucoup de smarts dans vos one-liners bash. Si vous ne pensez pas que les points-virgule trichent...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
10
répondu Fordi 2016-01-21 11:08:28

peut-être voulez-vous un alias pour ne pas avoir à vous souvenir de tous les détails délicats. Après avoir fait l'une des étapes ci-dessous, vous pourrez simplement taper:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

à la suite de la réponse acceptée , voici deux façons de mettre en place ceci:

1) Enseignez à git la 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 enseigner raccourci, comme récemment commenté par Adrien:

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

à partir de Maintenant, utilisez git lastcommit pour montrer le hachage du dernier commit.

10
répondu miraculixx 2017-05-23 12:10:44

j'avais besoin de quelque chose d'un peu plus différent: afficher le sha1 de la commettre, mais ajouter un astérisque à la fin, si le répertoire de travail n'est pas propre. Sauf si je voulais utiliser plusieurs commandes, aucune des options dans les réponses précédentes ne fonctionne.

Voici la seule doublure qui ne:

git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"

Résultat: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

explication: décrit (à l'aide d'étiquettes annotées) le courant commit, mais seulement avec des tags contenant "NOT A TAG". Puisque les tags ne peuvent pas avoir d'espaces, cela ne correspond jamais à une tags et puisque nous voulons afficher un résultat --always , la commande revient en affichant le sha1 complet ( --abbrev=0 ) du commit et il ajoute un astérisque si le répertoire de travail est --dirty .

Si vous ne voulez pas ajouter l'astérisque, cela fonctionne comme toutes les autres commandes dans les réponses précédentes:

git describe --always --abbrev=0 --match "NOT A TAG"

Résultat: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

5
répondu Rado 2018-02-17 19:06:21
git show-ref --head --hash head

si vous allez pour la vitesse cependant, l'approche mentionnée par Deestan

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

est beaucoup plus rapide que n'importe quelle autre méthode énumérée ici jusqu'ici.

4
répondu Dennis 2017-05-23 12:34:44

Voici une doublure en shell Bash en utilisant la lecture directe des 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 dépôt, mais la commande git n'a pas été installée.

si cela ne fonctionne pas, cochez .git/refs/heads dans le dossier quel type de têtes avez-vous présentes.

4
répondu kenorb 2018-03-07 14:34:05

dans votre home-dir dans le fichier ".gitconfig "ajouter le texte suivant

[alias]
sha = rev-parse HEAD

alors vous aurez une commande plus facile à retenir:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
2
répondu jo_ 2016-02-18 16:16:08

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

git log | grep -o '\w\{8,\}' | head -n 1
1
répondu Marcelo Lazaroni 2017-02-10 15:14:12

Voici une autre implémentation d'accès direct:

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

cela fonctionne aussi sur http qui est utile pour les archives de paquets locaux (je sais: pour les sites Web publics il n'est pas recommandé de faire 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
répondu Daniel Alder 2016-11-16 15:07:23