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?
Vous pouvez jeter un oeil à git describe
, qui fait quelque chose de proche de ce que vous demandez.
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
Générera la balise du dernier commit étiqueté dans toutes les branches
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 = -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.
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.
git describe --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 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é.
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.
Vous pouvez exécuter: git describe --tags $(git rev-list --tags --max-count=1)
parlée ici: Comment obtenir le dernier nom de tag?
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
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.
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
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
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.
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.
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")
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.
si vos tags sont triables:
git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
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.
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}'
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.