Push git commits & tags simultanément

388

Je suis conscient de la raison pour laquelle git push --tagsc'est une opération distincte de plaine ancienne git push. Pousser les balises devrait être un choix conscient, car vous ne voulez pas en pousser une accidentellement. C'est très bien. Mais existe-t-il un moyen de rapprocher les deux? (Mis à part git push && git push --tags.)

Will Robertson
la source
4
Quel est ton problème git push && git push --tags?
fuz
21
Rien de particulier, c'est juste plus lent car la connexion doit être établie deux fois.
Will Robertson
16
Voir ma réponse mise à jour ci-dessous: il y a une nouvelle --follow-tagsoption depuis git 1.8.3
VonC
24
Une autre raison de ne pas les faire séparément est d'éviter de déclencher deux builds CI pour le même commit, lorsque ce type d'automatisation est en place.
Alex R
aussi --tagsne distingue pas entre les balises légères et annotés la source
karlsebal

Réponses:

556

Mise à jour mai 2015

Depuis git 2.4.1 , vous pouvez faire

git config --global push.followTags true

Si la valeur est true, activez l'option --follow-tags par défaut.
Vous pouvez remplacer cette configuration au moment de l'envoi en spécifiant --no-follow-tags.

Comme indiqué dans ce fil de discussion par Matt Rogers répondant à Wes Hurd :

--follow-tags ne pousse que les balises annotées .

git tag -a -m "I'm an annotation" <tagname>

Ce serait poussé (par opposition à git tag <tagname>une balise légère, qui ne serait pas poussée, comme je l'ai mentionné ici )

Mise à jour avril 2013

Depuis git 1.8.3 (22 avril 2013) , vous n'avez plus besoin de faire 2 commandes pour pousser les branches, puis pour pousser les balises :

La nouvelle --follow-tagsoption " " indique à " git push" de pousser les balises annotées pertinentes lors de la sortie des branches .

Vous pouvez maintenant essayer, en poussant de nouveaux commits:

git push --follow-tags

Cela ne poussera pas toutes les balises locales cependant, seulement celle référencée par les commits qui sont poussées avec le git push.

Git 2.4.1+ (Q2 2015) introduira l'option push.followTags: voir " Comment faire" git push"inclure des balises dans une branche? ".

Réponse originale, septembre 2010

L'option nucléaire serait git push --mirror, ce qui poussera tous les arbitres sous refs/.

Vous pouvez également envoyer une seule balise avec votre validation de branche actuelle:

git push origin : v1.0.0 

Vous pouvez combiner l' --tagsoption avec une refspec comme:

git push origin --tags :

(puisque cela --tagssignifie: toutes les références sous refs/tagssont poussées, en plus des références spécifiées explicitement sur la ligne de commande )


Vous avez également cette entrée " Pousser les branches et les balises avec une seule invocation " git push " "

Un conseil pratique vient d'être publié sur la liste de diffusion Git par Zoltán Füzesi:

J'utilise .git/configpour résoudre ce problème:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

Avec ces lignes ajoutées git push origin, toutes vos branches et balises seront téléchargées. Si vous souhaitez n'en télécharger que certains, vous pouvez les énumérer.

Je ne l'ai pas encore essayé moi-même, mais il semble que cela pourrait être utile jusqu'à ce qu'une autre façon de pousser les branches et les balises en même temps soit ajoutée à git push.
D'un autre côté, cela ne me dérange pas de taper:

$ git push && git push --tags

Méfiez - vous , comme commenté par Aseem Kishore

push = +refs/heads/*va forcer toutes vos branches .

Cela m'a mordu tout à l'heure, alors pour info.


René Scheibe ajoute ce commentaire intéressant :

Le --follow-tagsparamètre est trompeur car seules les balises sous .git/refs/tagssont prises en compte.
Si git gcest exécuté, les balises sont déplacées de .git/refs/tagsvers .git/packed-refs. Ensuite, git push --follow-tags ...ne fonctionne plus comme prévu.

VonC
la source
3
Le seul commentaire sur le post auquel vous liez indique correctement que la push = +refs/heads/*ligne force -pousse toutes vos branches. Cela m'a mordu tout à l'heure, alors pour info.
Aseem Kishore
2
Re: le --follow-tagsdrapeau ajouté dans git 1.8.3, puis-je configurer mon installation git pour en faire la valeur par défaut?
Trevor Burnham
1
@TrevorBurnham non, seule la valeur de push.default( git-scm.com/docs/git-config peut définir des actions par défaut sur push) ( nothing, matching, upstream, simplecomme dans stackoverflow.com/a/10002469/6309 ). Vous devez ajouter --follow-tagexplicitement.
VonC
1
@VonC Et si je veux forcer le push du tag? git push --follow-tags -fn'a pas fonctionné pour moi.
mauryat
1
Le --follow-tagsparamètre est trompeur car seules les balises sous .git/refs/tagssont prises en compte. Si git gcest exécuté, les balises sont déplacées de .git/refs/tagsvers .git/packed-refs. Ensuite, git push --follow-tags ...ne fonctionne plus comme prévu.
René Scheibe
4

Peut-être que cela aide quelqu'un:

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          
Rajesh Gupta
la source
J'ai essayé votre solution avec git-2.21.0.windows.1 et j'ai découvert que 3 ne poussait que le tag
Dustin Sun
Ça marche bien de mon côté. Vous essayez toutes les 3 commandes dans l'ordre et le dépôt à distance est défini (git remote -v)?
Rajesh Gupta
J'ai utilisé "git commit -m" msg "à l'étape 1 et il n'y avait pas de paramètre -a. Cela pourrait être la raison. Merci pour le suivi!
Dustin Sun
2

@since Git 2.4

git push --atomic origin <branch name> <tag>

SoBeRich
la source
0

Git GUI

Git GUI a un bouton PUSH - pardonnez le jeu de mots, et la boîte de dialogue qu'il ouvre a une case à cocher pour les balises.

J'ai poussé une branche depuis la ligne de commande, sans balises, puis j'ai réessayé de pousser la branche en utilisant l' --follow-tagsoption décrite ci-dessus. L'option est décrite comme suit les balises annotées. Mes tags étaient de simples tags.

J'avais corrigé quelque chose, marqué le commit avec le correctif (pour que les collègues puissent choisir le correctif), puis changé le numéro de version du logiciel et marqué la version que j'avais créée (afin que les collègues puissent cloner cette version).

Git est revenu en disant que tout était à jour. Il n'a pas envoyé les tags! Peut-être parce que les balises n'étaient pas annotées. Peut-être parce qu'il n'y avait rien de nouveau sur la branche.

Quand j'ai fait un push similaire avec Git GUI, les tags ont été envoyés.

Tags envoyés avec Git GUI

Pour le moment, je vais pousser mes modifications sur mes télécommandes avec Git GUI et non avec la ligne de commande et --follow-tags.

Ivan
la source