Je voudrais conserver (pour l'instant) 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 (en utilisant un hook de Git) dans lequel je peux injecter des identifiants de travail dans le message d'un changeset Git.
Cependant, je voudrais également stocker l'identifiant de la validation Git (le hachage) dans un champ d'élément de travail TFS personnalisé. De cette façon, je peux examiner un élément de travail dans TFS et voir quels ensembles de modifications Git sont associés à l'élément de travail.
Comment puis-je récupérer facilement le hachage à partir du commit actuel de Git?
la source
--verify
implique que:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
renvoie la version courte du hachage, juste au cas où quelqu'un se demanderait.--short
, par exemple--short=12
, pour obtenir un nombre spécifique de chiffres du hachage.--short=N
correspond à un nombre minimal de chiffres; git utilise un plus grand nombre de chiffres si un raccourci ne se distingue pas d'un autre commit raccourci. Essayez par exemplegit rev-parse --short=2 HEAD
ougit log --oneline --abbrev=2
.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Si vous souhaitez uniquement le hachage raccourci:
De plus, l'utilisation de% H est une autre façon d'obtenir le long hachage.
la source
git log
c'est la porcelaine et lagit rev-parse
plomberie.git checkout 33aa44; git log -n 1
me donne33aa44
. Quelle version de git utilisez-vous?Un autre, en utilisant git log:
Il est très similaire à celui de @outofculture mais un peu plus court.
la source
HEAD
.HEAD
sur ce commit plutôt qu'une branche nommée connue sous le nom de tête détachée .Pour obtenir le SHA complet:
Pour obtenir la version raccourcie:
la source
git
commit
hachages sont nécessaires, comme l'un de celuibranch
avec lequel vous travaillez actuellement et unmaster
branch
, vous pouvez également l'utilisergit rev-parse FETCH_HEAD
si vous avez besoin du hachage pour celuimaster
commit
que vous avezmerge
ajouté à votre courantbranch
. Par exemple, si vous avezbranch
esmaster
etfeature/new-feature
pour un repo donné, alorsfeature/new-feature
vous pouvez utilisergit fetch origin master && git merge FETCH_HEAD
etgit rev-parse --short FETCH_HEAD
si vous avez besoin ducommit
hachage dumaster
vous venez de lemerge
d pour tous les scripts que vous pourriez avoir.Pour être complet, 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 surmaster
. Vous pouvez donc le lire à partir de là.Ou, comme commande:
Mise à jour:
Notez que git prend désormais en charge le stockage de certaines références de tête dans le fichier pack-ref au lieu d'un fichier dans le dossier / refs / heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
la source
master
, ce qui n'est pas nécessairement vrai.master
..git/HEAD
pointe généralement vers une référence, si vous avez un SHA1 dedans, vous êtes en mode tête détachée..git
sous - répertoire, ce qui n'est pas forcément le cas. Voir le--separate-git-dir
drapeau dans lagit init
page de manuel.Valider le hachage
Hachage de validation abrégé
Cliquez ici pour plus d'
git show
exemples.la source
Il y en a toujours
git describe
aussi. Par défaut, cela vous donne -la source
git describe --long --dirty --abbrev=10 --tags
cela me donne quelque chose comme7.2.0.Final-447-g65bf4ef2d4
447 commits après la balise 7.2.0.Final et les 10 premiers condensés du SHA-1 global à la HEAD actuelle sont "65bf4ef2d4". C'est très bon pour les chaînes de version. Avec --long, il ajoutera toujours le nombre (-0-) et le hachage, même si la balise correspond exactement.git describe --always
, "affichera l'objet de validation abrégé de manière unique comme solution de repli"git describe --tags --first-parent --abbrev=11 --long --dirty --always
. L'--always
option signifie qu'elle fournit un résultat (hachage) même s'il n'y a pas de balises. Les--first-parent
moyens qu'il ne soit pas confondu par commits de fusion et suit uniquement les éléments sur la branche courante. Notez également que--dirty
cela s'ajoutera-dirty
au résultat si la branche actuelle a des modifications non validées.Utilisation
git rev-list --max-count=1 HEAD
la source
Si vous devez stocker le hachage dans une variable pendant un script, vous pouvez utiliser
Ou, si vous ne voulez que les 10 premiers caractères (comme le fait github.com)
la source
--short
ou--short=number
pourgit rev-parse
; pas besoin d'utiliser un tuyau etcut
.Si vous voulez le faire de manière super-hacky:
Fondamentalement, git stocke l'emplacement de HEAD dans .git / HEAD, sous la forme
ref: {path from .git}
. Cette commande lit cela, supprime le "ref:" et lit le fichier vers lequel il pointait.Bien sûr, cela échouera en mode tête détachée, car HEAD ne sera pas "ref: ...", mais le hachage lui-même - mais vous savez, je ne pense pas que vous vous attendiez à autant d'intelligence dans votre bash one -liner. Si vous ne pensez pas que les points-virgules trichent, cependant ...
la source
sh
. Une demi-heure de commentaires sur la documentation plus tard, et en voici un résuméLa manière la plus succincte que je connaisse:
Si vous voulez un nombre spécifique de chiffres du hachage, vous pouvez ajouter:
la source
git show
c'est ce qu'on appelle une commande porcelaine (c'est-à-dire accessible à l'utilisateur), et ne doit donc pas être utilisée dans les scripts car sa sortie est sujette à changement. La réponse ci-dessus (git rev-parse --short HEAD
) doit être utilisée à la place.git help show
pourporcelain
.--porcelain
, c'est pourquoi cela prête à confusion. Vous pouvez trouver les détails dans cette excellente réponse de VonCPeut-être que vous voulez un alias pour ne pas avoir à vous souvenir de tous les détails astucieux. Après avoir effectué l'une des étapes ci-dessous, vous pourrez simplement taper:
Pour donner suite à la réponse acceptée , voici deux façons de procéder:
1) Apprenez à git de manière explicite en éditant la configuration globale (ma réponse d'origine):
2) Ou si vous aimez un raccourci pour enseigner à git un raccourci, comme l'a récemment commenté Adrien:
À partir de là, utilisez
git lastcommit
pour afficher le hachage du dernier commit.la source
git config --global alias.lastcommit "rev-parse HEAD"
J'avais besoin de quelque chose d'un peu plus différent: afficher le sha1 complet du commit, mais ajouter un astérisque à la fin si le répertoire de travail n'est pas propre. À moins que je veuille utiliser plusieurs commandes, aucune des options des réponses précédentes ne fonctionne.
Voici la doublure qui le 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 actuelle, mais uniquement avec des balises contenant "NOT A TAG". Étant donné que les balises ne peuvent pas avoir d'espaces, cela ne correspond jamais à une balise et puisque nous voulons afficher un résultat
--always
, la commande revient à afficher le full (--abbrev=0
) sha1 du commit et elle ajoute un astérisque si le répertoire de travail l'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
la source
--match "NOT A TAG"
. Testé dans git 2.18.0 ainsi que 2.7.4. Y a-t-il une situation où cet argument est nécessaire?Si vous optez pour la vitesse, l'approche mentionnée par Deestan
est nettement plus rapide que toute autre méthode répertoriée ici jusqu'à présent.
la source
show-ref
me semble être la meilleure option pour les scripts, car il est une commande de plomberie et donc garantie (ou tout au moins très probable) de rester stable dans les prochaines versions: d' autres réponses utilisentrev-parse
,show
,describe
oulog
, qui sont toutes les commandes de porcelaine. Et dans les cas où la vitesse n'est pas essentielle, la note de lashow-ref
page de manuel s'applique: 'L'utilisation de cet utilitaire est encouragée en faveur d'un accès direct aux fichiers sous le répertoire .git.'Voici une ligne dans le shell Bash utilisant la lecture directe à partir de fichiers git:
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
git
commande n'a pas été installée.Si cela ne fonctionne pas, vérifiez dans le
.git/refs/heads
dossier quel type de têtes avez-vous présent.la source
dans votre répertoire personnel dans le fichier ".gitconfig", ajoutez ce qui suit
alors vous aurez une commande plus facile à retenir:
la source
Sur git bash, exécutez simplement $ git log -1
vous verrez, ces lignes suivant votre commande.
la source
Voici une autre implémentation à accès direct:
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):
la source
Voici une autre façon de le faire avec :)
la source
Exemple de sortie:
ref: refs/heads/master
Analysez-le:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
Si vous avez des fenêtres, vous pouvez envisager d'utiliser wsl.exe:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
Production:
refs/heads/master
Cette valeur peut être utilisée pour git checkout plus tard, mais elle pointe vers son SHA. Pour faire pointer vers la branche actuelle réelle par son nom, procédez comme suit:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
Les sorties:
master
la source