2016-11-29 2 views
4

Je veux que tous les balises créées par l'utilisateur soient vérifiées (et renommées si nécessaire) pour satisfaire à nos règles.
Par exemple, si l'utilisateur a créé le tag "v1.2.3", il doit être automatiquement renommé "v1.02.03".Comment renommer automatiquement des tags en utilisant des crochets git?

Malheureusement, il n'existe aucun hook git qui est appelé par la commande git tag.

C'est pourquoi j'ai implémenté le hook pre-push, qui supprime l'ancien tag et en crée un nouveau (avec un nom modifié) sur le même commit.

Le problème est que git push --tags envoie OLD TAGS à repo distant au lieu de NEW TAGS (malgré le fait que les anciennes étiquettes n'existent plus après que le hook pré-push les ait supprimées). Comment renommer automatiquement les étiquettes sur un dépôt local avant de les repasser à distance?


EDIT:
Je résolu mon problème en dupliquant tag-renommage-logique post-receive crochet sur le côté serveur. Comme pour l'instant, le tag "v1.2.3" est renommé "v1.02.03" du côté client par le hook pre-push, mais l'ancien nom de tag ("v1.2.3") est poussé vers le repo distant, et sur le repo distant " v1.2.3 "est à nouveau renommé en" v1.02.03 "par post-receive hook. Maintenant, le client et le serveur ont le tag renommé.

Dois-je dire que je ne suis pas satisfait de ma solution?
La solution côté client pur est toujours la bienvenue.

+0

Cela me semble un cas où les étiquettes n'ont pas été correctement supprimées. Pourriez-vous partager le code du crochet de pré-poussée ici? –

+0

@mu - tags ont été correctement supprimés, je vois le message sur l'opération réussie imprimé par le crochet. Mon code contient la ligne suivante: 'os.execute ('git tag -d"' ..tagname .. '"&& git tag"' ..new_tag_name .. '"' ..commit .. '&& echo TAG RENOMMÉE | echo A ÉCHOUÉ POUR RENOMMER TAG ') '. Et je les vois réellement supprimés après que 'git push --tags' soit terminé. –

Répondre

0

Vous pouvez simplement mapper sur le côté pre-push du côté client, et faire de votre entreprise le changement de nom des tags locaux ici.

+0

Le crochet de pré-push est en cours d'exécution côté client, comme il se doit selon git manual. De quelle cartographie parlez-vous? –

+0

Renommez simplement les tags de ce hook avant qu'ils aient une chance d'être poussés. – blue112

+0

C'est ce que j'ai fait exactement. J'ai renommé les tags sur ce hook. –

2

Je ne suis pas un expert du noyau git, mais voici mon hypothèse: Lorsque vous utilisez le drapeau --tags, toutes les références sont déjà stockées en mémoire avant l'exécution du hook. De manpage pour-git push:

--tags 
     All refs under refs/tags are pushed, in addition to refspecs explicitly listed on the command line. 

Depuis les refs sont déjà présentes en mémoire, votre crochet pré-push changer les noms de balises/suppression et la création de nouvelles étiquettes n'a pas d'effet. IMO, pour prendre soin de tels cas, vous pouvez simplement modifier votre crochet de pré-push pour échouer si même une étiquette est nommée incorrectement, après avoir changé tous les noms d'étiquette. Ensuite, exécutez le pré-push à nouveau.

Alternativement, vous pouvez avoir une commande personnalisée - un alias git, qui renomme toutes les étiquettes selon vos besoins, et que les appels git push --tags. Vérifiez How to embed bash script directly inside a git alias.

+0

L'échec de 'git push' et de forcer l'utilisateur à pousser à nouveau est une très mauvaise solution. –

+0

@EgorSkriptunoff Yup, c'est un mauvais hack. Git alias pourrait résoudre cela pour vous si. –

+0

Suggérez-vous de créer une commande git personnalisée et ** d'enseigner ** à tous les développeurs pour l'utiliser? Ce n'est pas une solution du tout. Le changement de nom de tag doit être entièrement automatique. –