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?
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
.
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.
Un autre, en utilisant git log:
git log -1 --format="%H"
C'est très similaire à la @outofculture mais un peu plus court.
Pour obtenir le SHA complet:
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537
Pour obtenir la version abrégée:
$ git rev-parse --short HEAD
cbf1b9a
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
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
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
.
Utilisez git rev-list --max-count=1 HEAD
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)
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
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.
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
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
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.
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.
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
Voici une autre façon de le faire avec :)
git log | grep -o '\w\{8,\}' | head -n 1
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