Question

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 la date et l'heure de chaque balise et les comparer?

Était-ce utile?

La solution

Vous pouvez consulter git decrire , ce qui correspond à ce que vous demandez.

Autres conseils

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

Générera l'étiquette de la dernière validation validée dans toutes les branches

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

Pour obtenir la balise la plus récente, vous pouvez effectuer:

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

Bien sûr, vous pouvez modifier l’argument count ou le champ de tri à votre guise. Il semble que vous vouliez peut-être poser une question légèrement différente, mais cela répond à la question telle que je l'interprète.

Comment ça?

TAG = $ (git décrire $ (git liste-revis --tags --max-count = 1))

Techniquement, vous ne obtiendrez pas nécessairement la dernière balise, mais le dernier commit qui est étiqueté, ce qui peut être ou ne pas être ce que vous cherchez.

git decrire - tags

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

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

Vous pourriez 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 indiquer "quelle balise correspond le mieux à une branche nommée dans l'historique de développement", généralement la branche sur laquelle vous vous trouvez, HEAD . Dans votre question, cela renverrait la balise a .

Celles-ci peuvent bien sûr être différentes:

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

Imaginez lundi le code Z du développeur, puis v0.2 lundi, puis Q avec le code 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 son chemin commence par 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 puisque 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 commits sur HEAD puisque le chemin de balise a divergé:

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

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

Vous pouvez exécuter: git decrire --tags $ (git liste-revis --tags --max-count = 1) a parlé ici: Comment obtenir le dernier nom de balise?

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écrire --tags donne parfois des hachages incorrects, je ne sais pas pourquoi, mais pour moi - max-count 2 ne fonctionne pas)

voici comment vous pouvez obtenir une liste avec les 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 "balise:". chaîne en sortie - supprime simplement le dernier appel sed

Si vous souhaitez utiliser plus de 2 balises les plus récentes, modifiez-le "sed 2q". to "sed 5q" ou ce dont vous avez besoin

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

Quel est le problème dans toutes les suggestions (à l'exception de Matthew Brett , à la date du cette réponse post)?

Il suffit d'exécuter n'importe quelle commande fournie par un autre utilisateur dans l'historique Git jQuery lorsque vous êtes à un autre point d'historique et de vérifier le résultat avec la représentation visuelle de l'historique du marquage (j'ai fait c’est pourquoi vous voyez ce post):

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

De nos jours, de nombreux projets réalisent des versions (et donc des balises) dans une branche distincte de la ligne principale .

Il existe une raison forte . Il suffit de regarder tous les projets JS / CSS bien établis. Pour les conventions utilisateur, ils transportent des fichiers de version binaires / minifiés dans DVCS. Naturellement, en tant que responsable de projet, vous ne voulez pas gâcher votre historique diff avec des blobs binaires inutiles et effectuer la validation d'artefacts de construction hors du réseau principal .

Etant donné que Git utilise DAG et non un historique linéaire, il est difficile de définir la métrique de distance . Nous pouvons donc dire - oh que rev est le plus proche de mon HEAD !

Je commence mon propre voyage à l'intérieur (regardez à l'intérieur, je n'ai pas copié d'images de preuve élégante dans ce long post):

Quel est le plus proche tag dans le passé en ce qui concerne la création de branches dans Git?

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

  • longueur du chemin le plus court de HEAD à la base de fusion avec la balise
  • date de la base de fusion entre HEAD et la balise
  • nombre de tours pouvant être atteints à partir de HEAD mais non liés à une balise
  • date de la balise, quelle que soit base de fusion

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

Script permettant de trier les balises en fonction de la date de la base de fusion entre HEAD et la balise:

$ 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 permettant de trier les balises en fonction du nombre de tours accessibles depuis HEAD mais inaccessibles 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 comporte des dates étranges sur les commits (en raison de modifications de base ou d'une autre réécriture d'historique ou de l'oublie imbécile de remplacer la batterie du BIOS ou d'autres magies que vous effectuez dans l'historique), utilisez le script ci-dessus.

Pour la dernière option ( date du tag, quelle que soit la base de fusion ), obtenir la liste des balises triées par date d'utilisation:

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

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

$ git log --max-count=1

Notez que git describe --tags a une utilisation sur ses propres cas, mais pas pour rechercher la balise la plus proche attendue par l'homme dans l'historique du projet .

REMARQUE Vous pouvez utiliser les recettes ci-dessus pour n'importe quelle révision. Il vous suffit de remplacer HEAD par ce que vous voulez!

git tag -l ac* | tail -n1

Obtenez la dernière balise avec le préfixe "ac" . Par exemple, une balise portant le nom 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'infos

git tag --help # Help for `git tag`
git tag -l <pattern>
  

Liste les balises avec des noms qui correspondent au modèle donné (ou toutes si aucune              motif est donné). Exécution du " git tag " sans arguments aussi des listes              tous les tags. Le motif est un caractère générique de shell (c'est-à-dire, apparié à 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 la balise git --help , à propos de l'argument sort . Il utilisera par défaut ordre lexicorgraphique , si la propriété tag.sort n'existe pas.

  

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

Après Google, le quelqu'un a dit que la syntaxe suivante était prise en charge par git 2.8.0.

git tag --sort=committerdate

git décris --abbrev = 0 - tags

Si vous ne voyez pas la dernière balise, assurez-vous de rechercher l'origine avant d'exécuter cette opération:

mise à jour à distance git

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ée uniquement dans les cas où la dernière balise était 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 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 pourrait aider quelqu'un.

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 la balise git --contains . Lorsque vous trouvez une référence où la balise git - contient génère une liste non vide, vous avez trouvé la ou les balises les plus récentes.

Si vous souhaitez trouver la dernière balise appliquée à une branche spécifique, essayez les solutions suivantes:

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

C’est un vieux fil de discussion, 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 actuelle , vous utilisez git décrire HEAD . Fait.

Modifier: vous pouvez également fournir n’importe quel nom de référence valide, même les télécommandes; c'est-à-dire, git décrire l'origine / le maître vous indiquera la dernière balise accessible depuis l'origine / le maître.

Pour obtenir la dernière balise uniquement sur la branche actuelle / le nom de la balise préfixé par la branche actuelle, je devais 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
  

Personnalisation de la branche:

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 telle que posée,

  

Comment obtenir le dernier nom de balise dans la branche actuelle

vous voulez

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

- le premier parent indique à le journal git de ne pas détailler les historiques fusionnés, - pretty =% d indique d'afficher uniquement le les décorations, c'est-à-dire les noms locaux pour les commits. grep -m1 dit "ne correspond qu'à un", vous obtenez donc la balise la plus récente.

si vos tags sont triables:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top