Quelle est la manière la 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
production:
a
b
c
Dois-je écrire un script pour obtenir la date et l'heure de chaque balise et les comparer?
git
git-checkout
git-tag
getlatest
culebrón
la source
la source
Réponses:
Vous pouvez jeter un œil à
git describe
ce qui correspond à ce que vous demandez.la source
--abbrev=0
elle devrait retourner la balise annotée la plus prochegit describe --exact-match --abbrev=0
.git describe --tags
et comparer la dernière balise com dans la page de sortie de githubPour obtenir la balise la plus récente:
Pour obtenir la balise annotée la plus récente :
la source
git describe
:--abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
Affichera la balise du dernier commit balisé dans toutes les branches
la source
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursellPour obtenir la balise la plus récente, vous pouvez faire:
Bien sûr, vous pouvez modifier l'argument count ou le champ de tri comme vous le souhaitez. 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.
la source
--sort=-authordate
et--sort=authordate
.--sort=-taggerdate
. Pour les balises,authordate
etcommitterdate
sont vides (donc inutiles comme clés de tri).git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
c'est encore mieux :)--points-at=$SHA
vous donnera la balise pour un hachage de validation.Que dis-tu de ça?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Techniquement, vous n'obtiendrez pas nécessairement la dernière balise, mais la dernière validation qui est balisée, qui peut ou non être la chose que vous recherchez.
la source
--tags=<pattern>
dansrev-list
. Par exemple, obtenez la dernière balise de versiongit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Vous pouvez exécuter:
git describe --tags $(git rev-list --tags --max-count=1)
parlé ici: Comment obtenir le dernier nom de tag?la source
git describe ...
renvoie un tag plus tôt?!)--abbrev=0
J'ai essayé certaines des réponses et ils ont coupé une partie de la balise que je voulais."Le plus récent" pourrait avoir deux significations en termes de git.
Vous pourriez vouloir dire "quelle balise a la date de création la plus récente", et la plupart des réponses ici sont pour cette question. En ce qui concerne votre question, vous voudriez renvoyer la balise
c
.Ou vous pourriez dire « quelle balise est le plus proche dans l' histoire du développement à une branche nommée », généralement la branche que vous êtes,
HEAD
. Dans votre question, cela retournerait une balisea
.Celles-ci pourraient bien sûr être différentes:
Imaginez le développeur tag'ed
Z
commev0.2
le lundi, puis tag'edQ
commev0.1
le mardi.v0.1
est la plus récente, mais ellev0.2
est plus proche dans l'histoire du développement de HEAD, en ce sens que le chemin sur lequel elle 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 découvrir en utilisant
git log v0.2..HEAD
etc pour chaque balise. Cela vous donne le nombre de validations sur HEAD depuis 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 validations sur HEAD depuis que 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 revient (par exemple) à HEAD pour trouver la première balise qui se trouve sur un chemin de retour à partir de HEAD. En termes git,git describe
recherche les balises "accessibles" depuis HEAD. Il ne trouvera donc pas de telles balisesv0.2
qui ne sont pas sur le chemin du retour de HEAD, mais un chemin qui en a divergé.la source
git describe --tags
retourne la dernière balise visible par la branche courante
la source
SI VOUS AVEZ BESOIN DE PLUS D'UN DERNIER ÉTIQUETTE
(git décrit --tags donne parfois des hachages incorrects, je ne sais pas pourquoi, mais pour moi --max-count 2 ne fonctionne pas)
c'est ainsi que 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 chaîne "tag:" en sortie - supprimez simplement le dernier appel sed
Si vous voulez plus de 2 dernières balises - changez ce "sed 2q" en "sed 5q" ou tout ce dont vous avez besoin
Ensuite, vous pouvez facilement analyser chaque nom de balise en variable.
la source
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
où in%D
exclut les()
caractères environnants , et lesed
5q de départ s laisse 4 lignes avant 5, puis imprime tous les caractères entre 'tag: `et le premier', '. Donc ... en supposant qu'aucune virgule ne soit utilisée à l'intérieur de la balise, cela fonctionne parfaitement.Quel est le problème avec toutes les suggestions (sauf l' explication de Matthew Brett , à jour de ce message de réponse)?
Il suffit d'exécuter n'importe quelle commande fournie par d'autres sur l'historique jQuery Git lorsque vous êtes à un point différent de l'historique et de vérifier le résultat avec une représentation historique de l'étiquetage visuel (je l'ai fait, c'est pourquoi vous voyez ce post):
Aujourd'hui, de nombreux projets effectuent des versions (et donc du balisage) dans une branche distincte de la ligne principale .
Il y a une bonne raison à cela. Regardez simplement tous les projets JS / CSS bien établis. Pour les conventions utilisateur, ils portent des fichiers de version binaires / minifiés dans DVCS. Naturellement, en tant que responsable de projet, vous ne voulez pas gâcher votre historique de différences de ligne principale avec des objets binaires inutiles et effectuer la validation des artefacts de génération en dehors de la ligne principale .
Parce que Git utilise DAG et non un historique linéaire - il est difficile de définir la métrique de distance afin que nous puissions dire - oh ce régime est le plus proche de mon
HEAD
!Je commence mon propre voyage en (regardez à l'intérieur, je n'ai pas copié d'images à l'épreuve de fantaisie dans ce long post):
Quelle est la balise la plus proche dans le passé en ce qui concerne la ramification dans Git?
Actuellement, j'ai 4 définitions raisonnables de la distance entre le tag et la révision avec une diminution de l'utilité:
HEAD
de la base de fusion avec étiquetteHEAD
et tagJe ne sais pas comment calculer la longueur du chemin le plus court .
Script qui trie les balises en fonction de la date de la base de fusion entre
HEAD
et balise:Il est utilisable sur la plupart des projets.
Script qui trie les balises en fonction du nombre de tours accessibles depuis HEAD mais pas accessible depuis la balise:
Si l'historique de votre projet a des dates de validation étranges (en raison de rebases ou d'une autre réécriture de l'histoire ou d'un crétin oubliez de remplacer la batterie du BIOS ou d'autres magies que vous faites sur l'historique), utilisez le script ci-dessus.
Pour la dernière option ( date de balise indépendamment de la base de fusion ) pour obtenir la liste des balises triées par date, utilisez:
Pour obtenir la date de révision actuelle connue, utilisez:
Notez qu'ils
git describe --tags
ont une utilisation dans leurs propres cas, mais pas pour trouver la balise la plus proche attendue humaine dans l'historique du projet .REMARQUE Vous pouvez utiliser les recettes ci-dessus sur n'importe quelle révision, remplacez-les simplement
HEAD
par ce que vous voulez!la source
git describe --abbrev=0 --tags
Si vous ne voyez pas la dernière balise, assurez-vous de récupérer l'origine avant de l'exécuter:
git remote update
la source
Obtenez la dernière balise avec le préfixe "ac" . Par exemple, balise nommée avec
ac1.0.0
, ouac1.0.5
. Autres tags nommés1.0.0
,1.1.0
seront ignorés.Obtenez la dernière balise, dont le premier caractère est
0-9
. Ainsi, ces balises avec le premier caractèrea-z
seront ignorées.Plus d'informations
Mise à jour
Avec
git tag --help
, sur l'sort
argument. Il utiliseralexicorgraphic order
par défaut, si latag.sort
propriété n'existe pas.Après google, quelqu'un a dit que git 2.8.0 supporte la syntaxe suivante.
la source
la source
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é que dans le cas où le dernier tag était le
HEAD
.Cela convient à mes besoins, mais comme je ne suis pas un sorcier, je suis sûr qu'il pourrait être encore amélioré. Je soupçonne également qu'il se cassera au cas où l'historique des validations irait de l'avant. Je partage juste au cas où cela aiderait quelqu'un.
la source
Ma première pensée est que vous pourriez utiliser
git rev-list HEAD
, qui répertorie toutes les révolutions dans l'ordre chronologique inverse, en combinaison avecgit tag --contains
. Lorsque vous trouvez une référence oùgit tag --contains
produit une liste non vide, vous avez trouvé les balises les plus récentes.la source
Si vous souhaitez rechercher la dernière balise appliquée sur une branche spécifique, vous pouvez essayer ce qui suit:
la source
Si vous avez besoin d'un liner qui obtient le dernier nom de tag (par date de tag) sur la branche actuelle :
Nous l'utilisons pour définir le numéro de version dans la configuration.
Exemple de sortie:
Fonctionne également sur Windows.
la source
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) Et que--points-at=HEAD
je saute, cela fonctionne. Avec ce dernier interrupteur, il ne renvoie rien, je suppose que monHEAD
n'est pas étiqueté?HEAD
pas tagué.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 d'OP: pour obtenir la dernière balise de la branche actuelle , vous utilisez
git describe HEAD
. Terminé.Modifier: vous pouvez également fournir n'importe quel nom de référence valide, même des télécommandes; c'est-à
git describe origin/master
-dire, vous indiquera la dernière balise qui peut être atteinte à partir de l'origine / master.la source
for-each-ref
commande ( stackoverflow.com/a/5261470/515973 ) et la combinaison derev-list
etdescribe
( stackoverflow.com/a/7979255/515973 )git describe branchname --tags
fonctionne pour moi pour obtenir la dernière balise sur la branche (git version 2.12.2)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
Et mon dernier besoin d'augmenter et d'obtenir le tag +1 pour le prochain tag.
la source
Pour la question posée,
tu veux
--first-parent
indique degit log
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 "correspondre à un seul", vous obtenez donc la balise la plus récente.la source
si vos tags sont triables:
la source
Pas beaucoup de mention des balises non annotées par rapport aux balises annotées ici. «décrire» fonctionne sur les balises annotées et ignore celles qui ne le sont pas.
C'est moche mais fait le travail demandé et il ne trouvera aucune balise sur les autres branches (et pas sur celle spécifiée dans la commande: master dans l'exemple ci-dessous)
Le filtrage devrait probablement être optimisé (consolidé), mais encore une fois, cela semble faire l'affaire.
Les critiques sont les bienvenues car je vais maintenant mettre cela à profit :)
la source
Un autre moyen simple d'obtenir le dernier nom de balise est de
ou
pour le stocker dans une variable.
git tag
répertorie toutes les balises disponibles et renverra la toute dernière ligne si le résultat.tail
-1
la source