J'ai besoin de la commande Git pour get/find la dernière balise commençant par 'v' pour obtenir le dernier commit de versioning (j'utilise des balises avec une lettre v au début pour baliser la prochaine version de l'application ( exemple: v0. 9.1beta ).
Y a-t-il un moyen de le faire?
J'utilise la commande suivante pour cela:
git describe --match "v[0-9]*" --abbrev=4 HEAD
Cela modifiera également la version si vous avez fait quelque chose avec l’arborescence source depuis votre dernière balise versionnée.
Notez que ceci est pas une regex mais un glob mais fonctionne pour l'exemple fourni.
git tag -l -n v*
La réponse de KARASZI István explique déjà comment trouver des balises correspondant à un glob, ce qui est généralement suffisant. Si vous avez besoin d’un vrai RegEx:
for tag in $(git tag | grep YOURREGEX); do
git describe --tags --long --match="$tag" 2>/dev/null
done | sort -k2 -t"-" | head -n1
--abrev=0
obtiendrait), ajoutez | cut -d"-" -f1
--long
produise également une balise correspondante exactement incluant la partie -0-hash
, ajoutez plutôt | sed -e's/-0-.*$//'
.La balise d'exemple de la question utiliserait probablement un Regex ^v\d+\.\d+\.\d+\D*$
(bien que le \D*$
puisse être facultatif).
git describe --match v*
Utilisez ceci.
Bien qu'un seul regex --match "v[0-9]*"
soit suffisant ici, sachez que Git 2.13 (T2 2017) va améliorer cela:
"
git describe
" et "git name-rev
" ont appris à prendre plus d'un modèle de nom de référence pour restreindre le jeu de références sur lequel baser leur sortie de nommage, et ont également appris à utiliser des modèles négatifs pour nommer les références de ne pas être utilisé pour nommer via leur option "--exclude
".
Voir commit 77d21f2 , commit 43f8080 , commit 96415b4 , commit 290be66 , commit 4a68748 (18 janv. 2017) de Jacob Keller (jacob-keller
) .
(Fusion par Junio C Hamano - gitster
- in commit 1b32498 , 27 févr. 2017)
Vous pouvez maintenant avoir plusieurs modèles de correspondance :
--match <pattern>:
Ne considérez que les balises correspondant au modèle
glob(7)
donné, en excluant le préfixe "refs/tags /".
Ceci peut être utilisé pour éviter les fuites de tags privés du référentiel.Si elle est donnée plusieurs fois, une liste de motifs sera accumulée et les étiquettes correspondant à l'un des motifs seront considérées.
Utilisez--no-match
pour effacer et réinitialiser la liste des motifs.
Et vous avez également un motif exclude (ou plusieurs) maintenant !
--exclude <pattern>::
Ne considérez pas les balises correspondant au modèle
glob(7)
donné, à l’exclusion du préfixe "refs/tags /".Cela peut être utilisé pour restreindre l'espace des balises et trouver uniquement les balises correspondant à certains critères significatifs.
Si donné plusieurs fois, une liste de motifs sera accumulée et les balises correspondant à l’un des motifs seront exclues.
Lorsqu'elle est associée à--match
, une balise est considérée lorsqu'elle correspond à au moins un modèle--match
et ne correspond à aucun des modèles--exclude
.
Utilisez--no-exclude
pour effacer et réinitialiser la liste des motifs.
Également avec git décrire, vous pouvez obtenir la dernière balise non seulement accessible depuis HEAD avec:
git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)
Le problème avec l'utilisation de git describe
comme le font les autres réponses est que git describe
vous montrera les balises accessibles depuis HEAD (ou le commit que vous spécifiez.)
Imaginez que vous avez 3 balises, v1, v2 et v3. Si HEAD se situe entre v2 et v3, git describe
renverrait v2 plutôt que v3.
Si vous voulez réellement la dernière balise, vous avez tout d’abord besoin de balises annotées, car les balises légères n’ont pas de métadonnées de date.
Alors cette commande le fera:
git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*
J'utilise
git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"
git tag
interprète le motif en tant que glob. Donc, vous ne pouvez pas spécifier une regex complète. Il suffit d’utiliser un glob minimum (v *) ou même pas de glob du tout. Vous recevrez plus d'une balise correspondante par ordre trié (la version la plus élevée en premier) et vous pourrez ensuite donner une expression régulière à la sortie.