Dans les lignes suivantes:
$ git tag -n1
v1.8 Tagged the day before yesterday
v1.9 Tagged yesterday
v2.0 Tagged today
$ git describe
v1.9-500-ga6a8c67
$
Quelqu'un peut-il expliquer pourquoi la balise v2.0 n'est pas utilisée par "git describe" et comment y remédier? La balise v2.0 est déjà poussée, donc je suppose que je ne peux pas simplement la supprimer et la rajouter.
git describe
n'utilise que des balises annotées par défaut. spécifie le --tags
option pour lui faire également utiliser des balises légères
assurez-vous d'avoir vérifié le bon commit (git rev-parse HEAD
). les balises annotées sont créées avec git tag -a
. si tu fais git show <tagname>
et vous ne voyez que la validation, c'est une balise légère, si vous voyez un message de balise supplémentaire, c'est une balise annotée.
Lorsque cela nous est arrivé, il s'agissait de deux balises appliquées pour le même commit. Vous pouvez trouver si c'est le cas en exécutant
# git log --oneline --decorate=short
deba4b4 (tag: v1.1.0.20.0, tag: v1.1.0.19.0) 001 New buildnumber
Ici, il y a deux balises, une pour la version 19 et l'autre pour 20. 20 a été balisé après 19, mais pour le même commit. Dans ce cas, décrivez retourné
# git describe --tags
v1.1.0.19.0
Je ne sais pas pourquoi il a fait cela, mais c'est ainsi que cela semble fonctionner avec des balises en double.
Un autre cas où cela peut se produire est si vous avez une balise plus "proche" de vous dans une branche. Ce cas a été expliqué dans ce billet de blog .
Le problème est git tag
affiche toutes balises dans toutes les branches tandis que git describe
utilise uniquement des balises sur les validations qui sont disponibles dans le --- branch actuel.
Voici un exemple (la raison pour laquelle je suis venu ici en fait):
$ git tag | tail -n3
v0.4.0
v0.4.1
v0.4.2
Il montre que la dernière balise disponible est v0.4.2
, mais voici ma sortie de git describe
:
$ git describe --tags
v0.4.0-2-acd334c
Je suis sur la branche develop. Lorsque je fouille dans le journal, je vois en effet que les balises les plus récentes ne sont pas disponibles sur la branche actuelle:
$ git log --oneline --decorate=short | grep '\(tag\:' | head -n3
acd334c (tag: v0.4.0) Merge pull request #1061
988fe5e (tag: v0.3.6) Merge pull request #859
5f97274 (tag: v0.3.5) Merge pull request #646
Donc, dans mon cas, les développeurs ont décidé de créer une nouvelle branche release exclusivement pour le balisage des versions, ce qui fait que la branche develop n'est plus à jour avec les balises.
J'espère que cela aide et remercie @eis pour l'idée de vérifier les journaux.
Très probablement d'après votre exemple, v1.9
est une balise de merge commit.
C'est un comportement git attendu par défaut et vous pouvez en savoir plus ici: https://git.kernel.org/pub/scm/git/git.git/commit/?id=80dbae
Pour ignorer les balises de fusion lorsque vous recherchez les plus récentes sur la branche actuelle, vous pouvez utiliser --first-parent
option.
git describe --tags --first-parent --abbrev=0
- premier parent
Suivez uniquement le premier commit parent en voyant un commit de fusion. Ceci est utile lorsque vous souhaitez ne pas faire correspondre les balises sur les branches fusionnées dans l'historique de la validation cible.