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?
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
.
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.
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.
Pour obtenir le plein SHA:
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537
pour obtenir la version abrégée:
$ git rev-parse --short HEAD
cbf1b9a
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
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
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)
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
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
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.
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
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.
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.
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
Voici une autre façon de le faire avec:)
git log | grep -o '\w\{8,\}' | head -n 1
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