Come spingere diversi rami Git locali su Heroku / master


402

Heroku ha una politica di ignorare tutti i rami tranne "padrone".

Mentre sono sicuro che i progettisti di Heroku hanno eccellenti ragioni per questa politica (sto indovinando per l'ottimizzazione dello storage e delle prestazioni), la conseguenza per me come sviluppatore è che qualunque ramo di argomento locale su cui sto lavorando, vorrei un modo semplice per passare il master di Heroku a quel ramo di argomento locale e fare un "git push heroku -f" per sovrascrivere il master su Heroku.

Quello che ho ottenuto leggendo la sezione "Pushing Refspecs" di http://progit.org/book/ch9-5.html è

git push -f heroku ramo-argomento-locale: refs / heads / master

Quello che mi piacerebbe davvero è un modo per impostarlo nel file di configurazione in modo che "git push heroku" faccia sempre quanto sopra, sostituendo il ramo dell'argomento locale con il nome di qualunque ramo attuale. Se qualcuno sa come farlo, per favore fatemelo sapere!

L'avvertenza per questo, ovviamente, è che questo è sensato solo se sono l'unico che può spingere verso quell'app / repository Heroku. Un team di test o di QA potrebbe gestire un repository di questo tipo per provare diversi rami candidati, ma dovrebbero coordinarsi in modo che siano tutti d'accordo su quale ramo stanno spingendo ad esso in un dato giorno.

Inutile dire che sarebbe anche una buona idea avere un repository remoto separato (come GitHub) senza questa limitazione per il backup di tutto. Chiamerei quella "origine" e userei "heroku" per Heroku in modo che "git push" esegua sempre il backup di tutto sull'origine, e "git push heroku" spinge qualsiasi ramo che sono attualmente sul ramo principale di Heroku, sovrascrivendolo se necessario.

Funzionerebbe?

[remoto "heroku"]
    url = git@heroku.com: my-app.git
    push = + refs / heads / *: refs / heads / master

Mi piacerebbe avere notizie da qualcuno con più esperienza prima di iniziare a sperimentare, anche se suppongo di poter creare un'app fittizia su Heroku e sperimentarla.

Per quanto riguarda il recupero, non mi interessa davvero se il repository Heroku è di sola scrittura. Ho ancora un repository separato, come GitHub, per il backup e la clonazione di tutto il mio lavoro.

Nota a piè di pagina: questa domanda è simile, ma non è la stessa della distribuzione di Good Git che usa la strategia dei rami con Heroku?


1
La risposta attualmente più votata è il modo idiomatico di farlo (e Imo la vera risposta corretta)
Selali Adobor

Una risorsa https alternativa sulla spinta di refspecs: documentazione git scm sulla spinta di refspecs .
Dylan Landry,

Risposte:


131

Quando si utilizza un carattere jolly, è necessario che sia presente su entrambi i lati del refspec, quindi +refs/heads/*:refs/heads/masternon funzionerà. Ma puoi usare +HEAD:refs/heads/master:

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

Inoltre, puoi farlo direttamente con git push :

git push heroku +HEAD:master
git push -f heroku HEAD:master

4
qual è la differenza tra questi due comandi o dobbiamo eseguire entrambi
Saad Masood,

2
@SaadMasood: Gli ultimi git pushcomandi fanno la stessa cosa. Vedere git push --helpper il significato -fdell'opzione e +nel refspec.
Chris Johnsen,

4
@ Chris Johnson: Potresti dirci cosa significano i parametri -f invece di RTFMing i ragazzi qui?
AHH,

@AHH -fsta per forza . Ha funzionato per me con la risposta di Jassa .
Mr. Tao,

@Chris Johnson: HEAD è utilizzato solo per spingere la versione più recente dell'app, anziché l'intera storia?
Cameron Wilby,

1566

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

$ git push heroku yourbranch:master

24
Potrebbe richiedere una forza -f.
Scott Stafford,

Questo non sembra più funzionare, nonostante sia ancora nei loro documenti. Anche con la forza, il server rifiuta il push dicendo che non può cancellare il ramo principale.
Dave Meehan,

3
@DaveMeehan funziona ancora. Stai provando a fare ciò git push :masterche cancella il ramo principale sovrascrivendolo con niente. È diverso dal sovrascriverlo con un altro ramo. Heroku probabilmente ha messo in atto delle misure di sicurezza per impedire l'eliminazione del ramo principale.
Dennis,

Questa è una soluzione fantastica
Ajay Kumar

2
@nxmohamad No, a meno che il tuo ramo non sia dietro il ramo principale e desideri sovrascrivere il codice corrente su Heroku.
Ricks

64
git push -f heroku local_branch_name:master

3
Fai attenzione, questo usa -fo --force, ed è sempre meglio assicurarti di sapere cosa stai facendo quando forzi la spinta.
MiFiHiBye

@ tomasz-mazur perché richiede -f?
nxmohamad,

Sì, potremmo aver bisogno di usare -f in alcuni casi come lavorare con più rami in corso e sostituire qualsiasi cosa in heroku e testare il ramo di lavoro, per favore avvisa nel caso avessimo un altro modo migliore per testare
Fahad,

funziona sul mio computer, grazie per la risposta, questa sintassi è valida nel normale repository Github?
Luk Aron,

10

Il comando più sicuro per inviare diversi rami Git locali a Heroku / master.

git push -f heroku branch_name:master

Nota: sebbene sia possibile eseguire il push senza usare -f, si consiglia -f (force flag) per evitare conflitti con i push di altri sviluppatori.


1
non pensi che sia meglio fare pratica prima senza -f? quindi se ci sono conflitti, per prima cosa confermare che va bene scrivere su di essi
nxmohamad,

7

Per me funziona

git push -f heroku otherBranch:master

Si consiglia -f (force flag) per evitare conflitti con le spinte di altri sviluppatori. Dato che non stai usando Git per il tuo controllo di revisione, ma solo come trasporto, usare la bandiera della forza è una pratica ragionevole.

fonte: - documenti ufficiali


5

Si noti inoltre che se si utilizza il sistema git flow e il ramo della funzione potrebbero essere chiamati

feature/mobile_additions

e con un telecomando git chiamato stagingtwo, allora sarebbe il comando di spingere verso heroku

git push stagingtwo feature/mobile_additions:master

4

Dovresti dare un'occhiata a heroku_san , risolve questo problema abbastanza bene.

Ad esempio, potresti:

git checkout BRANCH
rake qa deploy

Inoltre, semplifica la creazione di nuove istanze Heroku per distribuire un ramo argomento su nuovi server:

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

E, naturalmente, puoi fare attività di rake più semplici se fai qualcosa di frequente.




0

Penso che dovrebbe essere

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

anziché...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.