web-dev-qa-db-fra.com

Comment savoir sur quel commit une balise pointe dans Git?

J'ai un groupe de balises non annotées dans le référentiel et je veux déterminer le commit sur lequel elles pointent. Existe-t-il une commande qui répertorie simplement les balises et leurs commandes SHA de validation? Vérifier l'étiquette et regarder le HEAD me semble un peu trop laborieux.

Mettre à jour

Après avoir lu les réponses, je me suis rendu compte que ce que je voulais, c’était simplement regarder l’historique qui a conduit à la balise, pour lequel git log <tagname> est suffisant. 

La réponse marquée comme réponse est utile pour obtenir une liste de balises et leurs commits, ce que j'ai demandé. Avec un peu de bidouillage de Shell, je suis sûr qu'il est possible de les transformer en message SHA + Commit.

340
Igor Zevaka

Une façon de faire cela serait avec git rev-list. Les éléments suivants généreront le commit sur lequel une balise pointe:

$ git rev-list -n 1 $TAG

Vous pouvez l'ajouter comme alias dans ~/.gitconfig si vous l'utilisez beaucoup:

[alias]
  tagcommit = rev-list -n 1

Et puis appelez-le avec:

$ git tagcommit $TAG
272
mipadi
git show-ref --tags

Par exemple, git show-ref --abbrev=7 --tags vous montrera quelque chose comme ce qui suit:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
206
CB Bailey

Il suffit d'utiliser git show <tag>

Cependant, il supprime également les diffs de validation. Pour omettre ces différences, utilisez git log -1 <tag>. (Merci à @ DolphinDream et @demisx!)

89
Hlung

Sur mon référentiel, git show-ref TAG affiche le hachage de la balise, pas le hachage du commit sur lequel il pointe.

git show-ref --dereference TAG indique, en outre, le commit sur lequel on pointe.

33
orip

Utilisation

git rev-parse --verify <tag>^{commit}

(qui renverrait SHA-1 d'un commit même pour une balise annotée).


git show-ref <tag> fonctionnerait également si <tag> n'était pas annoté. Et il y a toujours git for-each-ref (voir la documentation pour plus de détails).

32
Jakub Narębski

De Igor Zevaka :

Résumé

Puisqu'il y a environ 4 réponses presque également acceptables mais différentes, je vais résumer toutes les différentes façons de traiter un tag.

  1. git rev-list -1 $TAG ( répondre ). git rev-list génère les commits qui mènent au $TAG, similaire à git log mais ne montrant que le SHA1 de la validation. Le -1 limite la sortie au commit sur lequel il pointe.

  2. git show-ref --tags ( answer ) affichera toutes les balises (locales et extraites à distance) et leurs SHA1.

  3. git show-ref $TAG ( answer ) affichera la balise et son chemin avec SHA1.

  4. git rev-parse $TAG ( answer ) affichera le SHA1 d’une balise non annotée.

  5. git rev-parse --verify $TAG^{commit} ( answer ) affichera un SHA1 de balises annotées et non annotées. Sous Windows, utilisez git rev-parse --verify %TAG%^^^^{commit} (quatre chapeaux).

  6. cat .git/refs/tags/* ou cat .git/packed-refs ( answer ) selon que la balise est locale ou extraite de la télécommande.

32
user456814

Que dis-tu de ça:

git log -1 $TAGNAME

OU 

git log -1 Origin/$TAGNAME
15
Tuong Le

Pour obtenir le sha/hash du commit auquel une balise fait référence (pas le sha de la balise):

git rev-list -1 <tag>

10
Daniel Little

J'aimerais aussi connaître le "bon" chemin, mais en attendant, vous pouvez le faire:

git show mytag | head -1    
7
gahooa

Même si c'est assez vieux, j'ai pensé signaler une fonctionnalité intéressante que je viens de trouver pour la liste des balises avec commits:

git log --decorate=full

Il montrera les branches qui se terminent/commencent par un commit et les balises pour les commits.

5
Terrence Reilly

Vous pouvez également obtenir une image plus facile à interpréter indiquant où les balises indiquent l'utilisation de

git log --graph |git name-rev --stdin --tags |less

puis faites défiler jusqu'au tag que vous recherchez via /.

Une vue plus compacte (--pretty=oneline) et toutes les têtes (-a) pourraient également aider:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Cela semble un peu terrifiant, mais pourrait aussi être aliasé dans ~/.gitconfig si nécessaire.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
4
Antony Hatchkins

Cela vous donnera le hash SHA1 actuel 

Hachage de validation abrégé

git show <tag> --format="%h" --> 42e646e

Commit Hash 

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
3
Louis

je voudrais aussi savoir de la bonne façon , mais vous pouvez toujours jeter un coup d'œil sur

$ cat .git/packed-refs 

ou:

$ cat .git/refs/tags/*
2
miku

Si vous souhaitez voir les détails de la balise SOMETAG (tagger, date, etc.), le hachage du commit sur lequel il pointe et quelques informations sur le commit, mais sans le diff complet, essayez

git show --name-status SOMETAG

Exemple de sortie:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....
2
Avy Sharell

A partir de git mailing list , voici comment obtenir la liste des hachages de validation pour les balises avec déréférencement automatique pour les balises annotées:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
1
anatoly techtonik

Cela ne montre pas les noms de fichiers, mais au moins vous avez une idée du référentiel.

cat .git/refs/tags/*

Chaque fichier de ce répertoire contient une validation SHA pointant vers une validation.

1
Peter Stuifzand

J'ai donc une charge de dossiers de publication, où ces dossiers peuvent être extraits de l'un des quelques dépôts, et peuvent être des branches dev, qa ou master, ou bien des versions de production, extraits d'une étiquette, et l'étiquette peut être annoté ou non. J'ai un script qui va regarder le dossier cible et obtenir une réponse sous la forme -. Le problème est que différentes versions de git renvoient un statut différent 'pour une extraction de balise. 

J'ai donc trouvé que git show-ref --tags fonctionnait initialement, à l'exception des balises annotées. Cependant, l'ajout de -d a ajouté une entrée distincte à la liste des balises, une pour la balise, l'autre pour l'annotation (la validation d'annotation a été identifiée comme étant ^ {}, que j'ai supprimée avec sed). 

Voici donc le cœur de mon script, pour tous ceux qui le souhaitent: -

REPO=`git --git-dir=${TARGET} remote show Origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi
0
sibaz

Peut utiliser ci-dessous, il donnera le hachage commit
git show -s --format=%H <tag>^{commit}

Si un hachage de validation abrégé est requis, git show -s --format=%h <tag>^{commit}

0