Cara mendorong cabang Git lokal yang berbeda ke Heroku / master

402

Heroku memiliki kebijakan mengabaikan semua cabang kecuali 'tuan'.

Meskipun saya yakin desainer Heroku memiliki alasan yang sangat baik untuk kebijakan ini (saya menduga untuk penyimpanan dan optimalisasi kinerja), konsekuensinya bagi saya sebagai pengembang adalah bahwa apa pun cabang topik lokal yang sedang saya kerjakan, saya ingin cara mudah untuk mengalihkan master Heroku ke cabang topik lokal dan melakukan "git push heroku -f" untuk menulis master yang berlebihan pada Heroku.

Apa yang saya dapat dari membaca bagian "Mendorong Refspecs" di http://progit.org/book/ch9-5.html adalah

git push -f heroku cabang-topik-lokal: ref / kepala / master

Apa yang saya benar-benar suka adalah cara untuk mengatur ini di file konfigurasi sehingga "git push heroku" selalu melakukan hal di atas, mengganti cabang topik-lokal dengan nama apa pun cabang saya saat ini. Jika ada yang tahu bagaimana mencapainya, beri tahu saya!

Peringatan untuk ini, tentu saja, adalah bahwa ini hanya masuk akal jika saya adalah satu-satunya yang dapat mendorong ke aplikasi / repositori Heroku itu. Tim uji atau QA mungkin mengelola repositori seperti itu untuk mencoba cabang-cabang kandidat yang berbeda, tetapi mereka harus berkoordinasi sehingga mereka semua sepakat tentang cabang apa yang mereka dorong pada hari tertentu.

Tak perlu dikatakan, itu juga akan menjadi ide yang sangat bagus untuk memiliki repositori jarak jauh yang terpisah (seperti GitHub) tanpa batasan ini untuk mendukung semuanya. Saya akan menyebutnya "asal" dan menggunakan "heroku" untuk Heroku sehingga "git push" selalu mencadangkan segalanya untuk asal, dan "git push heroku" mendorong cabang apa pun yang saya gunakan saat ini ke cabang utama Heroku, menimpanya jika diperlukan.

Apakah ini akan berhasil?

[remote "heroku"]
    url = [email protected]: my-app.git
    push = + referensi / kepala / *: referensi / kepala / master

Saya ingin mendengar dari seseorang yang lebih berpengalaman sebelum saya mulai bereksperimen, meskipun saya kira saya bisa membuat aplikasi tiruan di Heroku dan bereksperimen dengan itu.

Sedangkan untuk mengambil, saya tidak terlalu peduli apakah repositori Heroku hanya untuk penulisan. Saya masih memiliki repositori terpisah, seperti GitHub, untuk cadangan dan kloning semua pekerjaan saya.

Catatan Kaki: Pertanyaan ini mirip dengan, tetapi tidak sama dengan penyebaran Good Git menggunakan strategi cabang dengan Heroku?

Lawrence I. Siden
sumber
1
Jawaban yang paling banyak dipilih saat ini adalah cara idiomatis untuk melakukan ini (dan Imo jawaban yang benar benar)
Selali Adobor
Sumber daya https alternatif tentang mendorong refspec: dokumentasi git scm tentang mendorong refspec .
Dylan Landry

Jawaban:

131

Saat menggunakan wildcard, itu harus ada di kedua sisi refspec, jadi +refs/heads/*:refs/heads/mastertidak akan berfungsi. Tapi Anda bisa menggunakan +HEAD:refs/heads/master:

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

Anda juga dapat melakukan ini secara langsung dengan git push :

git push heroku +HEAD:master
git push -f heroku HEAD:master
Chris Johnsen
sumber
4
apa bedanya antara dua perintah ini atau apakah kita harus menjalankan keduanya
Saad Masood
2
@ SaadMasood: git pushPerintah terakhir yang melakukan melakukan hal yang sama. Lihat git push --helpuntuk arti dari -fopsi dan +di dalam refspec.
Chris Johnsen
4
@ Chris Johnson: Bisakah Anda memberi tahu kami apa arti parameter -f alih-alih RTFMing ke sini?
AHH
@AHH -fberarti kekuatan . Ini bekerja untuk saya dengan jawaban jassa .
Tuan Tao
@ Chris Johnson: Apakah KEPALA digunakan untuk hanya mendorong rilis terbaru dari aplikasi, bukan seluruh sejarah?
Cameron Wilby
1566

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

$ git push heroku yourbranch:master
jassa
sumber
24
Mungkin membutuhkan kekuatan -f.
Scott Stafford
Ini tampaknya tidak lagi berfungsi, meskipun masih dalam dokumen mereka. Bahkan dengan paksa, server menolak push yang mengatakan bahwa itu tidak dapat menghapus cabang master.
Dave Meehan
3
@DaveMeehan ini masih berfungsi. Anda mencoba melakukan git push :masteryang menghapus cabang master dengan menimpanya tanpa apa-apa. Itu berbeda dari menimpanya dengan cabang lain. Heroku mungkin memiliki perlindungan untuk mencegah penghapusan cabang master.
Dennis
Ini adalah solusi yang luar biasa
Ajay Kumar
2
@nxmohamad Tidak kecuali cabang Anda berada di belakang cabang master dan Anda ingin mengganti kode saat ini di Heroku.
ricks
64
git push -f heroku local_branch_name:master
Tomasz Mazur
sumber
3
Hati-hati, ini menggunakan -fatau --force, dan itu selalu yang terbaik untuk memastikan Anda tahu apa yang Anda lakukan ketika Anda memaksa.
MiFiHiBye
@ tomasz-mazur mengapa ini membutuhkan -f?
nxmohamad
Ya kita mungkin perlu menggunakan -f dalam beberapa kasus seperti bekerja dengan beberapa cabang dalam proses dan mengganti apa pun di heroku dan menguji cabang kerja, mohon saran jika kita memiliki cara lain yang lebih baik untuk menguji
Fahad
ini berfungsi di komputer saya, terima kasih atas jawabannya, sebenarnya apakah sintaks ini valid dalam repositori Github yang normal?
Luk Aron
10

Perintah teraman untuk mendorong cabang Git lokal yang berbeda ke Heroku / master.

git push -f heroku branch_name:master

Catatan: Meskipun, Anda dapat mendorong tanpa menggunakan -f, -f (bendera paksa) disarankan untuk menghindari konflik dengan dorongan pengembang lain.

techdreams
sumber
1
tidakkah menurutmu lebih baik berlatih tanpa -f dulu? maka jika ada konflik, untuk mengkonfirmasi terlebih dahulu bahwa tidak apa-apa untuk menuliskannya
nxmohamad
7

Bagi saya, itu berfungsi,

git push -f heroku otherBranch:master

-F (flag paksa) direkomendasikan untuk menghindari konflik dengan dorongan pengembang lain. Karena Anda tidak menggunakan Git untuk kontrol revisi Anda, tetapi sebagai transportasi saja, menggunakan flag kekuatan adalah praktik yang wajar.

sumber: - dokumen resmi

Ashad Nasim
sumber
5

Perhatikan juga bahwa jika Anda menggunakan sistem aliran git dan cabang fitur Anda mungkin dipanggil

feature/mobile_additions

dan dengan remote git bernama stagingtwo, maka perintah untuk mendorong ke heroku adalah

git push stagingtwo feature/mobile_additions:master
Jonathon Batson
sumber
4

Anda harus memeriksa heroku_san , itu memecahkan masalah ini dengan cukup baik.

Misalnya, Anda dapat:

git checkout BRANCH
rake qa deploy

Ini juga membuatnya mudah untuk memutar instance Heroku baru untuk menyebarkan cabang topik ke server baru:

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

Dan tentu saja Anda dapat membuat tugas menyapu yang lebih sederhana jika Anda sering melakukan sesuatu.

jqr
sumber
1

Laboratorium Heroku sekarang menawarkan add-on github yang memungkinkan Anda menentukan cabang mana yang akan didorong.

Lihat tulisan Heroku di fitur beta ini.

Anda harus mendaftar sebagai penguji beta untuk saat ini.

irth
sumber
0

Saya pikir seharusnya begitu

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

sebagai gantinya...

ken
sumber