2010-02-24 6 views
30

J'ai un référentiel qui a plusieurs balises sur le même commit. Par exemple:Comment obtenir des balises sur la validation en cours

commit #3 <--- TAG1/TAG2/TAG3 

    | 

commit #2 <--- TAG4/ TAG5 

    | 

commit #1 <--- TAG6/ TAG7 

Je voudrais savoir quelles balises sont sur une validation particulière. Par exemple, si je vérifie commettre 1, je voudrais obtenir un tag 6 et 7. tag

J'ai essayé:

git checkout <commit 1> 
git tag --contains 

qui affiche les balises 1-7.

git checkout <commit 1> 
git describe --tags HEAD 

n'affiche que l'étiquette 6.

Quelle est la bonne façon de faire cela dans Git?

Répondre

3

Ce n'est pas idéal, mais peut-être utile:

 
$ git log -n 1 --decorate --pretty=oneline 

Vous pouvez jouer avec le format pour obtenir exactement ce que vous voulez.

+0

Merci pour votre information, mon repo a plus de 300 gits différents. Appuyez sur "Q" pour 300 fois très dur pour moi. – Shawn

+0

@Shawn Il n'est pas nécessaire d'appuyer sur Q ... –

+0

Chaque fois que j'utilise git log pour afficher quelque chose, j'ai besoin d'appuyer sur le bouton q pour quitter le mode d'affichage du journal. Je ne suis pas sûr si vous faites face à la même – Shawn

17

Quelques améliorations sur la réponse de William:

git config --global alias.tags 'log -n1 --pretty=format:%h%d' 

La sortie ressemble à ceci:

~$ git tags 
7e5eb8f (HEAD, origin/next, origin/master, origin/HEAD, master) 
~$ git tags HEAD~6 
e923eae (tag: v1.7.0) 
+1

c'est un conseil cool – cmcginty

+0

J'essaye d'ajouter des commandes de sed/tr/grep pour convertir cette sortie dans une liste simple sans ponctuation. Je peux construire une telle commande 'git log' directement, mais l'échappement me tue quand je le mets dans un alias git config. Voici ma commande de journal: git log -n1 --pretty = "format:% d" | sed "s /,/\ n/g" | étiquette grep | sed "s/tag: \ |) // g" –

+0

J'ai raffiné cela pour le rendre plus utile aux scripts automatisés (par exemple mettre les balises dans votre invite), dans une réponse ci-dessous ... –

18

Je suppose que git a eu quelques options ajoutées depuis cette question a été posée, mais comme il vient encore en assez haut sur google, je pensais que je voudrais ajouter que cette façon fonctionne bien:

git tag -l --contains HEAD 

Ou remplacez HEAD par toute autre référence de validation valide que vous aimez.

Cela affichera une nouvelle ligne séparée liste des balises si la tête contient des balises, et rien d'impression sinon, vous obtiendrez:

TAG6 
TAG7 

Et bien sûr, il y a beaucoup de belles façons avec divers autres shell outils que vous pouvez formater cette sortie une fois que vous l'avez ...

+1

Fonctionne parfaitement. Juste pourquoi avez-vous besoin de '-l'? D'après le manuel, il semble que '-l' sans arguments liste tous les tags, ce qui revient au même que' tag' sans arguments. –

+0

@cirosantilli oups, je suppose que je n'ai pas lu le manuel avec suffisamment d'attention. Bien que je pense que j'aime ajouter le «-l» parce qu'il s'assure que je ne finis pas en ajoutant une nouvelle balise si j'oublie le drapeau '--contains'. – arcticmac

+6

Cela donne la mauvaise sortie. Il montre toutes les étiquettes qui 'contiennent' la validation donnée, c'est-à-dire que les balises appliquées aux commits joignables précédents sont également incluses. La question d'origine dit explicitement qu'il ne veut pas ces vieilles étiquettes, seulement les balises 'current' sur le commit donné. –

3

Voici une amélioration de la réponse de @ JoshLee, qui manipule la sortie pour lister seulement les balises (pas de branches, ni HEAD) et dépouille le mot 'tag:' et ponctuation décorative. Ceci est utile si vous Scripting quelque chose qui a besoin de trouver les balises actuelles (par exemple, les mettre dans votre message):

git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 

sortie Exemple:

$ git log -n 1 --decorate=short 
commit a9313...c7f2 (HEAD, tag: v1.0.1, tag: uat, mybranch) 
... 
$ git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 
v1.0.1 
uat 
3

Cette affiche commit id de la tête, ainsi que toutes les branches ou toutes les étiquettes qui se trouvent également exactement à HEAD.

git reflog --decorate -1 

Exemple de sortie:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) [email protected]{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD 
55

Pour la fin (grâce à Ciro Santili réponse), git-tag a obtenu l'option --points-à ce fait exactement ce que Shawn demande.

git tag -l --points-at HEAD 

Il n'a pas l'effet à la liste également les balises mises en avant engage comme Jonathan Hartley a déclaré dans son commentaire des --contains git-tag.

+0

Ceci est la meilleure réponse ici. Pas de ligne de commande compliquée nécessaire, mais donne juste le nom du tag. –

+0

Exactement ce dont j'avais besoin, merci. –

Questions connexes