Comment trouver la balise associée à un commit git donné?

90

Pour les versions, j'étiquette généralement avec quelque chose comme v1.1.0. Pendant mon script de construction, je crée un fichier fwVersion.c qui contient les informations git actuelles. Actuellement, j'ai des informations de commit et de branche dans le fichier, mais je voudrais ajouter la balise.

Est-ce possible?

nous s
la source

Réponses:

114

Consultez la documentation pour git describe. Il trouve la balise la plus proche d'un commit donné (c'est-à-dire une balise qui pointe vers un ancêtre du commit) et décrit ce commit en termes de balise.

Si vous voulez seulement savoir si le commit est pointé par une balise, vous pouvez vérifier la sortie de:

git describe --exact-match <commit-id>
CB Bailey
la source
32
git describe --tags <commit-id>pour les tags non annotés
Aleksandr Levchuk
1
J'aime cela. Plus précisément, j'adore pouvoir obtenir un humain lisible à partir de la révision actuelle:git describe --all --exact-match `git rev-parse HEAD`
dsummersl
5
Dans les versions plus récentes, ce git describe --tags --abbrev=0 REVsera utile lorsque vous ne voulez pas que le courrier indésirable sur l'étiquette.
Craig Ringer
1
git describe --all(pour le commit actuellement vérifié) ou git describe --all <commit>j'ai toujours fait à peu près tout ce que j'ai toujours voulu.
rfay
La meilleure partie de l'utilisation des versions de git est de ne plus coder en dur la version dans la source lorsqu'un logiciel est déployé. La méthode de git describe pour trouver la balise la plus proche peut être utilisée pour calculer le numéro de version suivant et ajouter simplement une référence de balise au référentiel et au nom du package.
Sid
62

Si vous voulez la première balise contenant le commit, alors:

git describe --contains <commit>

donne la meilleure réponse IMO. Si vous avez des balises fréquentes que d'utiliser "git tag --contains" sur un ancien commit dans un grand référentiel peut prendre un certain temps à s'exécuter et vous donne toutes les balises qui contiennent ce commit.

Cette forme de git describe s'exécute très rapidement et vous donne une valeur de sortie unique qui est la première balise contenant le commit et à quelle distance se trouve votre commit.

Geai
la source
27

Que dis-tu de ça?

git tag --points-at <commit-id>

Il vous donne toutes les balises du commit donné (alors git describeque vous n'en donne qu'un), et n'inclut pas les balises sur les commits descendants (comme le git tag --containsfait).

Albertas Agejevas
la source
J'aime cela car aucun message d'erreur n'est écrit sur stderr. Merci.
Basuke
23

Vous pouvez trouver ces informations dans le manuel

git tag --contains <commit>
Dharga
la source
3
Cela listera toutes les balises qui contiennent le commit donné (c'est-à-dire les balises qui pointent vers les enfants du commit donné), donc ça ne va pas nécessairement donner une seule balise pour un commit donné ou toute information sur quelle balise est la plus proche, à moins que le list ne contient qu'un seul commit.
CB Bailey
4
Comme Charles Bailey le dit plus haut, ce n'est pas exactement ce que je recherche. Peut-être que vous devriez RTFM :)
wes
1
Eh bien, désolé pour la mauvaise réponse. Quand j'ai vérifié, il semblait faire ce que vous demandiez. J'ai fait RTFM, je résolvais juste le mauvais problème. Hope Bailey a proposé une solution qui vous aide.
dharga
6
vous ne devriez pas avoir besoin de lire tout le manuel de git avant de poser une question git sur SO, non? google indexe tellement mieux que n'importe quelle page de manuel git ...
aaronstacy
13

J'ai trouvé la combinaison des deux principales réponses pour me donner ce que je voulais:

git describe --tags --exact-match <commit-id>

Cela vous donne la balise qui est UNIQUEMENT pour ce commit et pour ceux sans annotation. Utile lorsque vous souhaitez rechercher des balises et ne pas vous soucier de supprimer la mise en forme (pour Jenkins par exemple).

par exemple. $ git describe --tags --exact-match head~2

Vous donne:

$ ReleaseBeta
Christopher Alexander
la source
0

Consolider certaines des réponses:

git tag --contains [<ref>]

et

git tag --points-at [<ref>]

ou juste

git tag

se comportent de la même manière, en imprimant toutes les balises (et toutes) pour la référence spécifiée ou le commit actuel si non spécifié.

git describe --tags [<ref>]

où par <ref>défaut la validation actuelle, quitte avec 128 si aucune balise n'est associée à la validation, et affiche une balise associée à la validation (il ne semble pas y avoir de modèle).

git describe [<ref>] se comporte de la même manière que avec --tagssauf qu'il n'imprime que les balises annotées.

Fournir l'option --containsà describeaffichera la balise a qui est associée à un ancêtre du commit spécifié. Par exemple

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

bschlueter
la source