Comment pousser différentes branches locales de Git vers Heroku / master

402

Heroku a pour politique d'ignorer toutes les branches sauf «maître».

Bien que je sois sûr que les concepteurs de Heroku ont d'excellentes raisons pour cette politique (je suppose pour le stockage et l'optimisation des performances), la conséquence pour moi en tant que développeur est que quelle que soit la branche de sujet locale sur laquelle je puisse travailler, j'aimerais un moyen simple pour basculer le maître de Heroku vers cette branche de sujet locale et faire un "git push heroku -f" pour écraser le maître sur Heroku.

Ce que j'ai obtenu en lisant la section "Pushing Refspecs" de http://progit.org/book/ch9-5.html est

git push -f heroku local-topic-branch: refs / heads / master

Ce que j'aimerais vraiment, c'est un moyen de mettre cela en place dans le fichier de configuration pour que "git push heroku" fasse toujours ce qui précède, en remplaçant local-topic-branch par le nom de ce que ma branche actuelle est. Si quelqu'un sait comment y parvenir, faites-le moi savoir!

La mise en garde pour cela, bien sûr, est que cela n'est raisonnable que si je suis le seul à pouvoir accéder à cette application / référentiel Heroku. Une équipe de test ou d'assurance qualité pourrait gérer un tel référentiel pour essayer différentes branches candidates, mais elles devraient se coordonner de manière à ce qu'elles s'accordent toutes sur la branche sur laquelle elles le poussent un jour donné.

Inutile de dire que ce serait également une très bonne idée d'avoir un référentiel distant séparé (comme GitHub) sans cette restriction pour tout sauvegarder. Je l'appellerais "origine" et j'utiliserais "heroku" pour Heroku afin que "git push" sauvegarde toujours tout à l'origine, et "git push heroku" pousse n'importe quelle branche sur laquelle je suis actuellement vers la branche principale de Heroku, en l'écrasant si nécessaire.

Est-ce que cela fonctionnerait?

[heroku à distance]
    url = [email protected]: my-app.git
    push = + refs / heads / *: refs / heads / master

J'aimerais entendre quelqu'un de plus expérimenté avant de commencer à expérimenter, même si je suppose que je pourrais créer une application factice sur Heroku et expérimenter avec ça.

En ce qui concerne la récupération, je ne me soucie pas vraiment si le référentiel Heroku est en écriture seule. J'ai toujours un référentiel séparé, comme GitHub, pour la sauvegarde et le clonage de tout mon travail.

Note de bas de page: Cette question est similaire, mais pas tout à fait la même chose que le déploiement de Good Git en utilisant la stratégie des branches avec Heroku?

Lawrence I. Siden
la source
1
La réponse actuellement la plus votée est la façon idiomatique de le faire (et Imo la vraie réponse correcte)
Selali Adobor
Une ressource https alternative sur le push des refspecs: la documentation de git scm sur le push des refspecs .
Dylan Landry

Réponses:

131

Lors de l'utilisation d'un caractère générique, il devait être présent des deux côtés de la refspec, donc +refs/heads/*:refs/heads/mastercela ne fonctionnera pas. Mais vous pouvez utiliser +HEAD:refs/heads/master:

git config remote.heroku.push +HEAD:refs/heads/master

Vous pouvez également le faire directement avec git push :

git push heroku +HEAD:master
git push -f heroku HEAD:master
Chris Johnsen
la source
4
quelle est la différence entre ces deux commandes ou devons-nous exécuter les deux
Saad Masood
2
@SaadMasood: Ces dernières git pushcommandes font la même chose. Voir git push --helppour la signification de l' -foption et la +dans la refspec.
Chris Johnsen
4
@Chris Johnson: Pourriez-vous s'il vous plaît nous dire ce que signifie les paramètres -f au lieu de RTFMing les gars ici?
AHH
@AHH est -fsynonyme de force . Cela a fonctionné pour moi avec la réponse de Jassa .
M. Tao
@Chris Johnson: HEAD a-t-il l'habitude de pousser uniquement la version la plus récente de l'application, plutôt que toute l'histoire?
Cameron Wilby
1566

Voir https://devcenter.heroku.com/articles/git#deploying-code

$ git push heroku yourbranch:master
jassa
la source
24
Peut nécessiter une force -f.
Scott Stafford
Cela ne semble plus fonctionner, bien qu'il soit toujours dans leurs documents. Même avec force, le serveur rejette la poussée en disant qu'il ne peut pas supprimer la branche principale.
Dave Meehan
3
@DaveMeehan cela fonctionne toujours. Vous essayez de faire git push :masterce qui supprime la branche principale en la remplaçant par rien. C'est différent que de l'écraser avec une autre branche. Heroku a probablement des protections en place pour empêcher la suppression de la branche principale.
Dennis
C'est une solution géniale
Ajay Kumar
2
@nxmohamad Ce n'est pas le cas sauf si votre branche se trouve derrière la branche principale et que vous souhaitez remplacer le code actuel sur Heroku.
ricks
64
git push -f heroku local_branch_name:master
Tomasz Mazur
la source
3
Attention, cela utilise -fou --force, et il est toujours préférable de vous assurer que vous savez ce que vous faites lorsque vous forcez la poussée.
MiFiHiBye
@ tomasz-mazur pourquoi faut-il -f?
nxmohamad
Oui, nous pouvons avoir besoin d'utiliser -f dans certains cas, comme travailler avec plusieurs branches en cours et remplacer ce qui est dans heroku et tester la branche de travail, veuillez nous conseiller au cas où nous aurions une autre meilleure façon de tester
Fahad
cela fonctionne sur mon ordinateur, merci pour la réponse, est-ce que cette syntaxe est valide dans le référentiel Github normal?
Luk Aron
10

La commande la plus sûre pour pousser différentes branches Git locales vers Heroku / master.

git push -f heroku branch_name:master

Remarque: Bien que vous puissiez pousser sans utiliser le -f, le -f (indicateur de force) est recommandé afin d'éviter les conflits avec les poussées des autres développeurs.

techdreams
la source
1
ne pensez-vous pas qu'il vaut mieux se passer du -f en premier? puis s'il y a des conflits, pour confirmer d'abord qu'il est correct de les écrire
nxmohamad
7

Pour moi, ça marche,

git push -f heroku otherBranch:master

Le -f (indicateur de force) est recommandé afin d'éviter les conflits avec les poussées des autres développeurs. Étant donné que vous n'utilisez pas Git pour votre contrôle de révision, mais uniquement comme moyen de transport, l'utilisation de l'indicateur de force est une pratique raisonnable.

source: - documents officiels

Ashad Nasim
la source
5

Notez également que si vous utilisez le système git flow et votre branche de fonctionnalité peut être appelée

feature/mobile_additions

et avec une télécommande git appelée stagingtwo, alors la commande pour pousser vers heroku serait

git push stagingtwo feature/mobile_additions:master
Jonathon Batson
la source
4

Vous devriez vérifier heroku_san , cela résout très bien ce problème.

Par exemple, vous pourriez:

git checkout BRANCH
rake qa deploy

Cela facilite également la rotation de nouvelles instances Heroku pour déployer une branche de sujet sur de nouveaux serveurs:

git checkout BRANCH
# edit config/heroku.yml with new app instance and shortname
rake shortname heroku:create deploy # auto creates deploys and migrates

Et bien sûr, vous pouvez effectuer des tâches de râteau plus simples si vous faites quelque chose fréquemment.

jqr
la source
0

Je pense que ça devrait être

push = refs/heads/*:refs/heads/*

au lieu...

ken
la source