วิธีการผลักสาขา Git ในท้องถิ่นต่าง ๆ ไปยัง Heroku / master


402

Heroku มีนโยบายที่จะเพิกเฉยต่อสาขาทั้งหมดยกเว้น 'ต้นแบบ'

ในขณะที่ฉันแน่ใจว่านักออกแบบของ Heroku มีเหตุผลที่ยอดเยี่ยมสำหรับนโยบายนี้ (ฉันคาดเดาว่าสำหรับการจัดเก็บและการเพิ่มประสิทธิภาพ) ผลที่ตามมาสำหรับฉันในฐานะนักพัฒนาก็คือสิ่งใดก็ตามที่สาขาหัวข้อท้องถิ่นที่ฉันอาจจะทำงาน เพื่อเปลี่ยนเจ้านายของ Heroku เป็นสาขาหัวข้อท้องถิ่นนั้นและทำ "git push heroku -f" เป็น over-write master บน Heroku

สิ่งที่ฉันได้จากการอ่านหัวข้อ "การผลักผู้อ้างอิง" ของhttp://progit.org/book/ch9-5.htmlคือ

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

สิ่งที่ฉันชอบคือวิธีการตั้งค่านี้ในไฟล์กำหนดค่าเพื่อให้ "git push heroku" ทำสิ่งดังกล่าวข้างต้นเสมอโดยแทนที่ชื่อท้องถิ่นสาขาด้วยชื่อสิ่งที่สาขาปัจจุบันของฉันเกิดขึ้น หากใครรู้วิธีที่จะทำให้สำเร็จโปรดแจ้งให้เราทราบ!

แน่นอนว่าสำหรับสิ่งนี้แน่นอนว่ามันเป็นเรื่องที่สมเหตุสมผลถ้าฉันเป็นคนเดียวที่สามารถผลักดันแอพ / พื้นที่เก็บข้อมูลของ Heroku ทีมทดสอบหรือ QA อาจจัดการที่เก็บดังกล่าวเพื่อลองสาขาที่แตกต่างกัน แต่พวกเขาจะต้องประสานงานเพื่อให้พวกเขาเห็นด้วยกับสาขาที่พวกเขากำลังผลักดันมันในวันใดวันหนึ่ง

จำเป็นต้องพูดมันเป็นความคิดที่ดีมากที่จะมีที่เก็บข้อมูลระยะไกลแยกต่างหาก (เช่น GitHub) โดยไม่มีข้อ จำกัด นี้สำหรับการสำรองข้อมูลทุกอย่าง ฉันจะเรียกสิ่งนั้นว่า "ต้นกำเนิด" และใช้ "heroku" สำหรับ Heroku เพื่อที่ "git push" จะสำรองทุกอย่างให้กำเนิดเสมอและ "git push heroku" จะผลักสาขาใดก็ตามที่ฉันกำลังจะไปที่สาขาหลักของ Heroku เขียนทับมัน ในกรณีที่จำเป็น.

จะใช้งานได้ไหม

[รีโมท "heroku"]
    url = git@heroku.com: my-app.git
    push = + refs / heads / *: refs / heads / master

ฉันต้องการได้ยินจากคนที่มีประสบการณ์มากขึ้นก่อนที่ฉันจะเริ่มการทดสอบถึงแม้ว่าฉันคิดว่าฉันสามารถสร้างแอปดัมมี่บน Heroku และทำการทดลองกับสิ่งนั้นได้

สำหรับการดึงฉันไม่สนใจว่าที่เก็บ Heroku เป็นแบบเขียนอย่างเดียว ฉันยังมีที่เก็บแยกต่างหากเช่น GitHub สำหรับการสำรองข้อมูลและการโคลนงานทั้งหมดของฉัน

เชิงอรรถ: คำถามนี้คล้ายกับ แต่ไม่เหมือนกับการปรับใช้ Good Git โดยใช้กลยุทธ์ Branch กับ Heroku ใช่ไหม


1
คำตอบที่ได้รับการโหวตมากที่สุดในขณะนี้เป็นวิธีที่สำนวนการทำเช่นนี้ (และ Imo คำตอบที่ถูกต้องจริง)
Selali Adobor

เป็นทรัพยากรที่ https ทางเลือกที่เกี่ยวกับการผลักดัน refspecs: SCM เอกสารเกี่ยวกับคอมไพล์ refspecs
Dylan Landry

คำตอบ:


131

เมื่อใช้ wildcard จะต้องแสดงทั้งสองข้างของ refspec ดังนั้น+refs/heads/*:refs/heads/masterจะไม่ทำงาน แต่คุณสามารถใช้+HEAD:refs/heads/master:

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

นอกจากนี้คุณสามารถทำได้โดยตรงด้วยgit push :

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

4
อะไรคือความแตกต่าง btween คำสั่งทั้งสองนี้หรือเราต้องทำทั้งสองอย่าง
Saad Masood

2
@ SaadMasood: git pushคำสั่งสุดท้ายที่ทำสิ่งเดียวกัน ดูgit push --helpความหมายของ-fตัวเลือกและ+ในการอ้างอิง
Chris Johnsen

4
@Chris Johnson: คุณช่วยบอกเราหน่อยได้ไหมว่า -f พารามิเตอร์หมายถึงอะไรแทนที่จะเป็น RTFMing พวกที่นี่?
AHH

@AHH -fย่อมาแรง จะทำงานให้ฉันกับคำตอบของ jassa
Mr. Tao

@Chris Johnson: HEAD เคยใช้เพื่อผลักดันแอปรุ่นล่าสุดเท่านั้นไม่ใช่ประวัติศาสตร์ทั้งหมดหรือไม่?
Cameron Wilby

1566

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

$ git push heroku yourbranch:master

24
อาจต้องใช้แรง -f
Scott Stafford

สิ่งนี้ดูเหมือนว่าจะไม่ทำงานอีกต่อไปแม้จะยังอยู่ในเอกสารของพวกเขา แม้จะมีผลบังคับใช้เซิร์ฟเวอร์ปฏิเสธการแจ้งเตือนว่าไม่สามารถลบสาขาหลักได้
Dave Meehan

3
@DaveMeehan ยังคงใช้งานได้อยู่ คุณกำลังพยายามgit push :masterที่จะลบสาขาหลักโดยเขียนทับมันโดยไม่ทำอะไรเลย มันแตกต่างจากการเขียนทับมันด้วยสาขาอื่น Heroku อาจมีมาตรการป้องกันเพื่อป้องกันการลบสาขาหลัก
เดนนิส

นี่เป็นทางออกที่ยอดเยี่ยม
Ajay Kumar

2
@nxmohamad ไม่ยกเว้นสาขาของคุณที่อยู่ด้านหลังสาขาหลักและคุณต้องการแทนที่รหัสปัจจุบันใน Heroku
ricks

64
git push -f heroku local_branch_name:master

3
ระวังสิ่งนี้ใช้-fหรือ--forceและดีที่สุดเสมอเพื่อให้แน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรเมื่อคุณผลักดัน
MiFiHiBye

@ tomasz-mazur ทำไมมันถึงต้องการ -f?
nxmohamad

ใช่เราอาจจำเป็นต้องใช้ -f ในบางกรณีเช่นทำงานกับสาขาที่กำลังดำเนินการหลายแห่งและแทนที่สิ่งที่อยู่ใน heroku และทดสอบสาขาที่ทำงานโปรดให้คำแนะนำในกรณีที่เรามีวิธีอื่นที่ดีกว่าในการทดสอบ
Fahad

มันใช้งานได้บนคอมพิวเตอร์ของฉันขอบคุณสำหรับคำตอบจริง ๆ แล้วไวยากรณ์นี้ใช้ได้ในที่เก็บ Github ปกติหรือไม่
Luk Aron

10

คำสั่งที่ปลอดภัยที่สุดในการผลักดันสาขา Git ในท้องถิ่นที่แตกต่างกันไปยัง Heroku / master

git push -f heroku branch_name:master

หมายเหตุ:แม้ว่าคุณสามารถพุชโดยไม่ใช้ -f แนะนำให้ใช้ -f (แฟล็กบังคับ) เพื่อหลีกเลี่ยงความขัดแย้งกับการพุชของผู้พัฒนารายอื่น


1
คุณไม่คิดว่ามันเป็นการปฏิบัติที่ดีกว่าถ้าไม่มี -f ก่อน? ถ้ามีข้อขัดแย้งกันก่อนอื่นให้ยืนยันว่าการเขียนทับพวกเขาไม่เป็นไร
nxmohamad

7

สำหรับฉันมันใช้งานได้

git push -f heroku otherBranch:master

แนะนำให้ใช้ -f (แฟล็กบังคับ) เพื่อหลีกเลี่ยงความขัดแย้งกับผู้พัฒนารายอื่น เนื่องจากคุณไม่ได้ใช้ Git สำหรับการควบคุมการแก้ไขของคุณ แต่เป็นการขนส่งเท่านั้นการใช้แฟล็กบังคับจึงเป็นวิธีปฏิบัติที่สมเหตุสมผล

แหล่งที่มา: - เอกสารทางการ


5

โปรดทราบด้วยว่าหากคุณใช้ระบบ git flow และสาขาฟีเจอร์ของคุณอาจถูกเรียกใช้

feature/mobile_additions

และด้วยรีโมตคอมไพล์ที่เรียกว่า stagingtwo จากนั้นคำสั่งเพื่อส่งไปยัง heroku จะเป็น

git push stagingtwo feature/mobile_additions:master

4

คุณควรตรวจสอบheroku_sanมันแก้ปัญหานี้ได้ค่อนข้างดี

ตัวอย่างเช่นคุณสามารถ:

git checkout BRANCH
rake qa deploy

นอกจากนี้ยังทำให้ง่ายต่อการหมุนอินสแตนซ์ Heroku ใหม่เพื่อปรับใช้สาขาหัวข้อกับเซิร์ฟเวอร์ใหม่:

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

และแน่นอนว่าคุณสามารถทำ rake ได้ง่ายขึ้นถ้าคุณทำอะไรบ่อย ๆ



1

ตอนนี้ห้องทดลองของ Heroku เสนอโปรแกรมเสริม gitub ที่ให้คุณระบุสาขาที่จะผลักดัน

ดู Heroku's write up เกี่ยวกับคุณสมบัติเบต้านี้

คุณจะต้องลงชื่อสมัครใช้เป็นผู้ทดสอบเบต้าในช่วงเวลานั้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.