web-dev-qa-db-fra.com

Comment obtenir le dernier nom de tag dans la branche actuelle de Git?

Quel est le moyen le plus simple d’obtenir le tag le plus récent dans Git?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

sortie:

a
b
c

Dois-je écrire un script pour obtenir la date et l'heure de chaque balise et les comparer?

359
culebrón

Vous pouvez jeter un oeil à git describe, qui fait quelque chose de proche de ce que vous demandez.

350
JB.

Pour obtenir la balise la plus récente:

git describe --tags

Pour obtenir la balise annotée la plus récente:

git describe --abbrev=0 --tags
517
acassis

Générera la balise du dernier commit étiqueté dans toutes les branches

git describe --tags $(git rev-list --tags --max-count=1)
249
kilianc

Pour obtenir le tag le plus récent, vous pouvez faire:

 $ git pour-chaque-ref refs/tags --sort = -taggerdate --format = '% (refname)' --count = 1 

Bien sûr, vous pouvez modifier l’argument count ou le champ de tri comme vous le souhaitez. Il semble que vous ayez eu l’intention de poser une question légèrement différente, mais cela répond à la question telle que je l’interprète.

35
William Pursell

Que dis-tu de ça?

TAG=$(git describe $(git rev-list --tags --max-count=1))

Techniquement, vous n'obtiendrez pas nécessairement le dernier tag, mais le dernier commit qui est étiqueté, ce qui peut être ou ne pas être ce que vous cherchez.

29
Wincent Colaiuta

git describe --tags

renvoie la dernière balise pouvant être vue par la branche en cours

21
beenhere4hours

"Le plus récent" pourrait avoir deux significations en termes de git.

Vous pouvez dire "quelle étiquette a la date de création la plus tardive", et la plupart des réponses ici concernent cette question. En ce qui concerne votre question, vous souhaitez renvoyer la balise c

Vous pouvez également vouloir dire "quelle balise est l'historique de développement le plus proche d'une branche nommée", généralement la branche sur laquelle vous vous trouvez, HEAD. Dans votre question, cela renverrait la balise a.

Ceux-ci peuvent être différents bien sûr:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

Imaginez que le développeur ait tagué Z comme v0.2 lundi, puis a marqué Q comme v0.1 mardi. v0.1 est le plus récent, mais v0.2 est plus proche de HEAD dans l'historique du développement, en ce sens que le chemin sur lequel il se trouve commence à un point plus proche de HEAD.

Je pense que vous voulez généralement cette deuxième réponse, plus proche dans l’histoire du développement. Vous pouvez le trouver en utilisant git log v0.2..HEAD etc pour chaque balise. Cela vous donne le nombre de commits sur HEAD car le chemin se terminant par v0.2 a divergé du chemin suivi par HEAD.

Voici un script Python qui le fait en parcourant toutes les balises exécutant cette vérification, puis en imprimant la balise avec le moins de validations possible sur HEAD car le chemin de balise a divergé:

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describe fait quelque chose de légèrement différent, en ce sens qu'il effectue un suivi depuis (par exemple) HEAD pour trouver la première balise figurant sur un chemin dans l'historique de HEAD. En termes génériques, git describe recherche les balises "accessibles" à partir de HEAD. Il ne trouvera donc pas de balises telles que v0.2 qui ne sont pas sur le chemin de retour de HEAD, mais un chemin qui en a divergé.

18
Matthew Brett
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

SI VOUS AVEZ BESOIN DE PLUS D'UNE DERNIÈRE ÉTIQUETTE

(git décris --tags donne parfois des hachages erronés, je ne sais pas pourquoi, mais pour moi - max-count 2 ne fonctionne pas)

voici comment vous pouvez obtenir la liste avec les 2 derniers noms de balises dans l’ordre chronologique inverse, fonctionne parfaitement sur git 1.8.4. Pour les versions précédentes de git (comme 1.7. *), Il n'y a pas de chaîne "tag:" dans la sortie - il suffit de supprimer le dernier appel sed

Si vous voulez plus de 2 balises récentes, remplacez "sed 2q" par "sed 5q" ou tout ce dont vous avez besoin.

Ensuite, vous pouvez facilement analyser chaque nom de balise en variable.

13
east

Vous pouvez exécuter: git describe --tags $(git rev-list --tags --max-count=1) parlée ici: Comment obtenir le dernier nom de tag?

11
xserrat

git describe --abbrev=0 --tags

Si vous ne voyez pas la dernière balise, assurez-vous de récupérer Origin avant de l'exécuter:

git remote update

9
Walter B
git tag -l ac* | tail -n1

Récupère la dernière balise avec le préfixe "ac". Par exemple, une balise nommée avec ac1.0.0 ou ac1.0.5. Les autres balises nommées 1.0.0, 1.1.0 seront ignorées.

git tag -l [0-9].* | tail -n1

Récupère la dernière balise dont le premier caractère est 0-9. Ainsi, les balises avec le premier caractère a-z seront ignorées.

Plus d'informations

git tag --help # Help for `git tag`

git tag -l <pattern>

Liste des balises avec des noms correspondant au modèle donné (ou à toutes si aucun modèle N'est donné). L'exécution de "balise git" sans argument répertorie également tous les tags. Le modèle est un caractère générique Shell (c'est-à-dire, mis en correspondance à l'aide de Fnmatch (3)). Plusieurs modèles peuvent être donnés; si l'un d'entre eux correspond, la balise est affichée.


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

Mettre à jour

Avec git tag --help, à propos de l'argument sort. Il utilisera lexicorgraphic order par défaut, si la propriété tag.sort n'existe pas.

Ordre de tri La valeur par défaut est la valeur configurée pour la variable tag.sort si elle est existe, ou ordre lexicographique autrement. Voir git-config (1).

Après Google, quelqu'un a dit git 2.8.0 prend en charge la syntaxe suivante.

git tag --sort=committerdate
9
AechoLiu

Ce qui suit fonctionne pour moi si vous avez besoin des deux dernières balises (par exemple, afin de générer un journal des modifications entre la balise actuelle et la balise précédente). Je ne l'ai testée que dans les cas où la dernière balise était la HEAD.

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

Cela répond à mes besoins, mais comme je ne suis pas un sorcier génial, je suis sûr que cela pourrait être encore amélioré. Je soupçonne également que cela se cassera au cas où l’historique des validations avance. Je partage juste au cas où cela aiderait quelqu'un.

5
Ivan Vučica

Ma première pensée est que vous pouvez utiliser git rev-list HEAD, qui répertorie tous les tours dans l’ordre chronologique inverse, en combinaison avec git tag --contains. Lorsque vous trouvez une référence où git tag --contains génère une liste non vide, vous avez trouvé la ou les balises les plus récentes.

3
Greg Hewgill

Si vous voulez trouver la dernière balise appliquée à une branche spécifique, essayez ce qui suit:

git describe --tag $(git rev-parse --verify refs/remotes/Origin/"branch_name")
2
Scyssion

C'est un vieux fil, mais il semble que beaucoup de gens manquent la réponse la plus simple, la plus simple et la plus correcte à la question de OP: pour obtenir la dernière balise de la branche current , utilisez git describe HEAD. Terminé.

Edit: vous pouvez également fournir n’importe quel nom de référence valide, même des télécommandes; C'est-à-dire que git describe Origin/master vous indiquera la dernière balise accessible depuis Origin/master.

1
dohpaz42

si vos tags sont triables:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
0
Clintm

Pour la question telle que posée,

Comment obtenir le dernier nom de tag dans la branche actuelle

tu veux

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parent indique à git log de ne pas détailler les historiques fusionnés, --pretty=%d indique de n’afficher que les décorations, c’est-à-dire les noms locaux pour les commits. grep -m1 dit "ne faire correspondre qu'un seul", vous obtenez donc la balise la plus récente.

0
jthill

Pour obtenir la dernière balise uniquement sur la branche actuelle/le nom de la balise qui préfixe la branche actuelle, j'ai dû exécuter ce qui suit

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

Maître de branche:  

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

Branche personnalisée:  

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

Et mon besoin final d’incrémenter et d’obtenir le tag +1 pour le prochain marquage.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
0
Sankarganesh Eswaran

Si vous avez besoin d’une ligne qui obtienne le dernier nom de balise (par date de balise) sur le branche actuelle:

git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD

Nous l'utilisons pour définir le numéro de version dans la configuration.

Exemple de sortie:

v1.0.0

Fonctionne aussi sous Windows.

0
Shivan