Comment obtenir le dernier nom d'étiquette dans la branche courante de Git?
Quelle est la façon la plus simple d'obtenir l'étiquette 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-time de chaque étiquette et les comparer?
19 réponses
vous pourriez jeter un oeil à git describe
, qui fait quelque chose proche de ce que vous demandez.
pour obtenir l'étiquette la plus récente:
git describe --tags
pour obtenir le plus récent annoté étiquette:
git describe --abbrev=0 --tags
affichera l'étiquette de la dernière propagation étiquetée sur toutes les branches
git describe --tags $(git rev-list --tags --max-count=1)
pour obtenir l'étiquette la plus récente, vous pouvez faire:
$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1
bien sûr, vous pouvez changer l'argument count ou le champ sort comme désiré. Il semble que vous dire de poser une question légèrement différente, mais cela ne veut répondre à la question que je l'interpréter.
et ça?
TAG=$(git describe $(git rev-list --tags --max-count=1))
techniquement, ne vous obtiendra pas nécessairement la dernière étiquette, mais le dernier commit qui est étiqueté, qui peut ou non être la chose que vous recherchez.
git describe --tags
renvoie la dernière étiquette visible par la branche courante
"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 récente dans le temps", et la plupart des réponses ici sont pour cette question. En ce qui concerne votre question, vous voudriez retourner l'étiquette c
.
ou" quelle étiquette est la plus proche dans l'histoire du développement d'une branche nommée", habituellement la branche sur laquelle vous êtes, HEAD
. Dans votre question, ceci retournerait l'étiquette a
.
ceux-ci pourraient être différents bien sûr:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
imaginez le développeur étiqueté Z
comme v0.2
le lundi, puis étiqueté Q
comme v0.1
le mardi. v0.1
est le plus récent, mais v0.2
est plus proche de la tête dans l'histoire du développement, dans le sens où le chemin sur lequel il se trouve commence à un point plus proche de la tête.
je pense que vous voulez habituellement cette deuxième réponse, plus près dans le développement de l'histoire. Vous pouvez le découvrir en utilisant git log v0.2..HEAD
etc pour chaque étiquette. Ceci vous donne le nombre de commits sur la tête puisque le chemin se terminant par v0.2
divergeait du chemin suivi par la tête.
voici un script Python qui fait cela en itérant toutes les balises qui exécutent cette vérification, puis en imprimant la balise avec le moins de commits sur la tête puisque le chemin de la balise divergeait:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
fait quelque chose de légèrement différent, en ce qu'il suit de retour de (par exemple) tête pour trouver la première étiquette qui est sur un chemin de retour dans l'histoire de la tête. En termes de git, git describe
cherche des étiquettes qui sont "accessibles" de la tête. Il ne trouvera donc pas des balises comme v0.2
qui ne sont pas sur le chemin du retour de HEAD, mais un chemin qui s'en est écarté.
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 mal de tables de hachage, je ne sais pas pourquoi, mais pour moi-max-comte 2 ne marche pas)
c'est ainsi que vous pouvez obtenir la liste avec les 2 derniers noms d'étiquette 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:" en sortie-il suffit de supprimer le dernier appel sed
Si vous voulez plus de 2 dernières étiquettes - changez ce "sed 2q" en" sed 5q "ou ce que vous avez besoin
alors vous pouvez facilement analyser chaque nom d'étiquette à variable ou ainsi.
git tag -l ac* | tail -n1
obtenir la dernière étiquette avec le préfixe " ac . Par exemple , étiquette nommée avec ac1.0.0
, ou ac1.0.5
. Les autres étiquettes nommées 1.0.0
, 1.1.0
seront ignorées.
git tag -l [0-9].* | tail -n1
Obtenir la dernière balise, dont le premier caractère est 0-9
. Donc, ces étiquettes avec le premier caractère a-z
seront ignorées.
plus d'information
git tag --help # Help for `git tag`
git tag -l <pattern>
Liste des étiquettes avec des noms qui correspondent au motif donné (ou, si aucune motif). L'exécution de "git tag" sans arguments contient aussi des listes toutes les balises. Le motif est un joker shell (i.e., assorti en utilisant fnmatch (3)). Plusieurs motifs peuvent être donnés; si l'un d'eux les matchs, le tag est affiché.
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
mise à Jour
Avec git tag --help
, à propos de la sort
argument. Il utilisera lexicorgraphic order
par défaut, si la propriété tag.sort
n'existe pas.
ordre de tri par défaut, la valeur configurée pour la balise.tri variable si elle existe, ou ordre lexicographique autrement. Voir git-config(1).
D'après google, quelqu'un a dit git 2.8.0 support suivant la syntaxe.
git tag --sort=committerdate
git describe --abbrev=0 --tags
si vous ne voyez pas la dernière étiquette, assurez-vous de vérifier l'origine avant de lancer que:
git remote update
Ce qui est mauvais avec toutes les suggestions (à l'exception de Matthieu Brett explication, jusqu'à la date de cette réponse post)?
juste exécuter n'importe quelle commande fournie par l'autre sur l'histoire de git jQuery quand vous à point différent de l'histoire et vérifier le résultat avec marquage visuel de la représentation de l'histoire (i did 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 le marquage) dans une branche séparée de la ligne principale .
Il y a bonne raison pour cela. Il suffit de regarder à tous les projets JS/CSS bien établis. Pour les conventions d'utilisateur, ils transportent des fichiers de publication binaires/abrégés dans les DVCS. Naturellement, en tant que responsable de projet, vous ne voulez pas jeter votre ligne principale diff histoire avec inutile les blobs binaires et effectuer la validation de construire des artefacts principale .
parce que Git utilise DAG et non histoire linéaire - il est difficile de définir la distance métrique donc nous pouvons dire-oh que rev est le plus proche de mon HEAD
!
je commence mon propre voyage dans (regardez à l'intérieur, je n'ai pas copié des images de preuve de fantaisie à ce long post):
Quelle est l'étiquette la plus proche dans le passé en ce qui concerne la ramification en Git?
actuellement, j'ai 4 définition raisonnable de la distance entre l'étiquette et la révision avec diminution de l'utilité:
- longueur du chemin le plus court à partir de
HEAD
à fusion "de base 1519190920" tag - date de fusion "de base 1519190920" entre
HEAD
et tag - nombre de tours qui sont accessibles à partir de la tête mais non à partir de l'étiquette
- date de la balise quel que soit fusion "de base 1519190920"
je ne sais pas comment calculer longueur du chemin le plus court .
Script qui trient les tags selon date de base de fusion entre HEAD
et étiquette:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
utilisable sur la plupart des projets.
Script qui trie les étiquettes selon nombre de Rév qui sont accessibles de la tête mais pas de l'étiquette:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
si votre histoire de projet ont des dates étranges sur commits (en raison de rebases ou une autre histoire réécriture ou un crétin oublier de remplacer la batterie de BIOS ou d'autres magiques que vous faites sur l'histoire) utiliser script ci-dessus.
Pour la dernière option ( date de la balise quel que soit fusion "de base 1519190920" ) pour obtenir la liste des balises triés 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, utilisez:
$ git log --max-count=1
noter que git describe --tags
ont une utilisation sur ses propres cas, mais pas pour trouver human expected nearest tag in project history .
NOTE vous pouvez utiliser les recettes ci-dessus sur n'importe quelle révision, il suffit de remplacer HEAD
par ce que vous voulez!
ce qui suit fonctionne pour moi dans le cas où vous avez besoin des deux dernières balises (par exemple, afin de générer le journal de changement entre la balise courante et la balise précédente). Je l'ai testé seulement dans la situation où la dernière étiquette é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\}\(.*\)_; _"`
cela répond à mes besoins, mais comme je ne suis pas un magicien de git, je suis sûr qu'il pourrait être encore amélioré. Je soupçonne aussi qu'il se brisera au cas où l'histoire de commettre va de l'avant. Je partage juste au cas où ça aiderait quelqu'un.
vous pouvez exécuter: git describe --tags $(git rev-list --tags --max-count=1)
parlé ici: Comment obtenir le dernier nom d'étiquette?
ma première pensée est que vous pouvez utiliser git rev-list HEAD
, qui liste tous les revs dans l'ordre chronologique inverse, en combinaison avec git tag --contains
. Lorsque vous trouvez un réf où git tag --contains
produit une liste non vide, vous avez trouvé le plus récent tag(s).
si vous voulez trouver la dernière étiquette qui a été appliquée sur une branche spécifique, vous pouvez essayer ce qui suit:
git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
C'est un vieux fil, mais il semble que beaucoup de gens manquent la réponse la plus simple, la plus facile et la plus correcte à la question de L'OP: pour obtenir la dernière étiquette pour le branche courante , vous utilisez git describe HEAD
. Faire.
Edit: vous pouvez également fournir n'importe quel refname valide, même les remotes; i.e., git describe origin/master
vous indiquera la dernière étiquette qui peut être atteint d'origine/master.
pour obtenir la dernière balise seulement sur le nom de la branche/balise courante qui préfixe avec la branche courante, je devais exécuter la suivante
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
Branche master:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
coutume 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 pour incrémenter et obtenir la balise +1 pour le marquage suivant.
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 d'étiquette dans la branche courante
vous voulez
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
dit git log
de ne pas détailler les histoires fusionnées, --pretty=%d
dit de ne montrer que les décorations, c'est-à-dire les noms locaux pour les commits. grep -m1
dit "match just one", donc vous obtenez juste l'étiquette la plus récente.
si vos étiquettes sont sortables:
git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1