web-dev-qa-db-fra.com

Comment obtenir les derniers critères de regex correspondant aux balises Git

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?

32
Lukasz

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.

46
KARASZI István
git tag -l -n v*
5
racerror

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
  • Si vous souhaitez uniquement la balise la plus proche (c.-à-d. Ce que --abrev=0 obtiendrait), ajoutez | cut -d"-" -f1
  • Si vous ne souhaitez pas que --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).

4
Tobias Kienzler
git describe --match v*

Utilisez ceci.

2
Lukasz

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.

2
VonC

É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)

2
Barthelemy Pavy

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*

1
Joe Alcorn

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.

0
Henning