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

Quel est le moyen le plus simple d’obtenir la balise la plus récente 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 le datetime de chaque tag et les comparer?

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

Pour obtenir le tag le plus récent:

 git describe --tags 

Pour obtenir le tag annoté le plus récent:

 git describe --abbrev=0 --tags 

Affiche la balise du dernier commit marqué dans toutes les twigs

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

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

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

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

Que dis-tu de ça?

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

Techniquement, vous ne recevrez pas nécessairement la dernière balise, mais la dernière validation qui est balisée, ce qui peut être ou ne pas être la chose que vous recherchez.

git describe --tags

renvoie la dernière balise pouvant être vue par la twig actuelle

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

Vous pourriez signifier, “quelle balise a la date de création la plus récente dans le temps”, et la plupart des réponses sont ici pour cette question. En termes de votre question, vous voudriez renvoyer l’étiquette c .

Ou vous pourriez vouloir dire “quelle balise est la plus proche de l’historique de développement d’une twig nommée”, généralement la twig sur laquelle vous êtes, HEAD . Dans votre question, cela renverrait l’étiquette a .

Celles-ci peuvent être différentes 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 désigné Z comme v0.2 lundi, puis marqué Q comme v0.1 mardi. v0.1 est la plus récente, mais v0.2 est plus proche de l’histoire de développement de HEAD, dans la mesure où le chemin d’access est plus proche de HEAD.

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

Voici un script Python qui fait cela en parcourant toutes les balises exécutant cette vérification, puis en imprimant la balise avec le moins de commits sur HEAD, car le chemin de la 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 revient de (par exemple) HEAD pour trouver la première balise qui est sur le chemin de l’histoire depuis HEAD. En termes généraux, git describe balises «accessibles» de HEAD. Il ne trouvera donc pas de balises comme v0.2 qui ne sont pas sur le chemin du retour de HEAD, mais un chemin qui en diffère.

 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 describe –tags donne parfois de mauvais hachages, je ne sais pas pourquoi, mais pour moi –max-count 2 ne fonctionne pas)

c’est ainsi que vous pouvez obtenir la liste des 2 derniers noms de balises dans l’ordre chronologique inverse, fonctionne parfaitement sur git 1.8.4. Pour les versions antérieures de git (comme 1.7. *), Il n’y a pas de chaîne “tag:” en sortie – il suffit de supprimer le dernier appel sed

Si vous voulez plus de 2 balises récentes – changez ce “sed 2q” en “sed 5q” ou tout ce dont vous avez besoin

Ensuite, vous pouvez facilement parsingr chaque nom de tag à variable ou à peu près.

git describe --abbrev=0 --tags

Si vous ne voyez pas la dernière balise, assurez-vous de récupérer l’origine avant d’exécuter celle-ci:

git remote update

Quel est le problème avec toutes les suggestions (sauf l’explication de Matthew Brett , à jour de ce post de réponse)?

Il suffit de lancer n’importe quelle commande fournie par d’autres sur l’historique de jQuery Git lorsque vous êtes à différents points de l’historique et des résultats de la vérification avec la représentation de l’historique de balisage visuel (c’est ce que vous voyez dans cet article):

 $ git log --graph --all --decorate --oneline --simplify-by-decoration 

De nos jours, de nombreux projets exécutent des versions (et donc des marquages) dans une twig distincte de la ligne principale .

Il y a de fortes raisons à cela. Regardez simplement les projets JS / CSS bien établis. Pour les conventions utilisateur, elles contiennent des fichiers de version binarys / minifiés dans DVCS. Naturellement, en tant que responsable de projet, vous ne voulez pas ranger votre historique de diff en ligne principale avec des blobs binarys inutiles et effectuer des validations d’artefacts de construction hors de la ligne principale .

Parce que Git utilise le DAG et non l’historique linéaire – il est difficile de définir la mésortingque de la distance , nous pouvons donc dire – oh, cette valeur est la plus proche de ma HEAD !

Je commence mon propre voyage (regardez à l’intérieur, je n’ai pas copié d’images à l’épreuve des fantaisies sur ce long message):

Quelle est la balise la plus proche dans le passé en ce qui concerne les twigments dans Git?

Actuellement, j’ai 4 définitions raisonnables de la distance entre l’étiquette et la révision avec une diminution de l’utilité:

  • longueur du plus court chemin depuis HEAD pour fusionner la base avec l’étiquette
  • date de fusion de la base entre HEAD et tag
  • nombre de tours accessibles depuis HEAD mais non accessibles depuis l’étiquette
  • date du tag indépendamment de la base de fusion

Je ne sais pas comment calculer la longueur du plus court chemin .

Script qui sortinge les balises en fonction de la date de la base de fusion entre HEAD et tag:

 $ git tag \ | while read t; do \ b=`git merge-base HEAD $t`; \ echo `git log -n 1 $b --format=%ai` $t; \ done | sort 

Il est utilisable sur la plupart des projets.

Script qui sortinge les balises en fonction du nombre de révolutions accessibles depuis HEAD mais non accessibles depuis la balise:

 $ git tag \ | while read t; do echo `git rev-list --count $t..HEAD` $t; done \ | sort -n 

Si l’historique de votre projet a des dates étranges lors des commits (à cause de rebases ou d’une autre réécriture de l’histoire, ou bien que certains oublient de remplacer la batterie du BIOS ou d’autres magies de l’histoire), utilisez le script ci-dessus.

Pour la dernière option ( date du tag quelle que soit la base de fusion ) pour obtenir la liste des tags sortingés par date:

 $ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r 

Pour connaître la date de révision actuelle, utilisez:

 $ git log --max-count=1 

Notez que git describe --tags est utilisé dans ses propres cas mais pas pour trouver la variable la plus proche de l’homme dans l’historique du projet .

REMARQUE Vous pouvez utiliser les recettes ci-dessus pour toute révision, remplacez simplement HEAD par ce que vous voulez!

 git tag -l ac* | tail -n1 

Récupère la dernière balise avec le préfixe “ac” . Par exemple, tag nommé 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 az seront ignorées.

Plus d’informations

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

 git tag -l  

Répertorier les étiquettes dont le nom correspond au modèle donné (ou tout si aucun motif n’est indiqué). Exécuter “git tag” sans arguments répertorie également toutes les balises. Le modèle est un caractère générique de shell (c.-à-d. Associé à l’aide de fnmatch (3)). Plusieurs modèles peuvent être donnés; Si l’un d’eux correspond, l’étiquette est affichée.


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

Mettre à jour

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

L’ordre de sorting utilise par défaut la valeur configurée pour la variable tag.sort si elle existe, ou l’ordre lexicographique dans le cas contraire. Voir git-config (1).

Après google, quelqu’un a dit que git 2.8.0 supportait la syntaxe suivante.

 git tag --sort=committerdate 

Ce qui suit fonctionne pour moi si vous avez besoin des deux dernières balises (par exemple, pour générer un journal des modifications entre la balise actuelle et la balise précédente). Je l’ai testé uniquement dans la situation où le dernier tag était le 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 convient à mes besoins, mais comme je ne suis pas un sorcier, je suis sûr que cela pourrait encore être amélioré. Je soupçonne également que cela va se casser au cas où l’histoire de l’engagement s’avancerait. Je ne fais que partager au cas où cela aiderait quelqu’un.

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

Ma première pensée est que vous pourriez 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ù la git tag --contains une liste non vide, vous avez trouvé la ou les balises les plus récentes.

Si vous souhaitez rechercher la dernière balise appliquée à une twig spécifique, vous pouvez essayer les éléments suivants:

 git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name") 

Ceci est un ancien thread, mais il semble que beaucoup de gens manquent de la réponse la plus simple, la plus simple et la plus correcte à la question d’OP: pour obtenir le dernier tag pour la twig actuelle , utilisez git describe HEAD . Terminé.

Edit: vous pouvez également fournir des refname valides, même des télécommandes; C’est-à-dire que git describe origin/master vous indiquera la dernière balise accessible depuis l’origine / le maître.

Pour obtenir la dernière balise uniquement sur le nom de la twig / balise actuelle qui préfixe la twig actuelle, j’ai dû exécuter les opérations suivantes:

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

Maître de twig:

 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 dernier besoin 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}' 

Pour la question posée,

Comment obtenir le dernier nom de tag dans la twig en cours

tu veux

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

--first-parent indique à git log ne pas détailler les historiques fusionnés, --pretty=%d dit de ne montrer que les décorations, c’est-à-dire les noms locaux pour tous les commits. grep -m1 dit “match juste un”, vous obtenez donc le tag le plus récent.

si vos tags sont sortingables:

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