Cách đẩy các nhánh Git cục bộ khác nhau đến Heroku / master


402

Heroku có chính sách bỏ qua tất cả các chi nhánh trừ 'chủ nhân'.

Mặc dù tôi chắc chắn rằng các nhà thiết kế của Heroku có lý do tuyệt vời cho chính sách này (tôi đoán là tối ưu hóa lưu trữ và hiệu suất), nhưng hậu quả đối với tôi là nhà phát triển là bất cứ ngành chủ đề địa phương nào tôi có thể làm việc, tôi muốn một cách dễ dàng để chuyển chủ nhân của Heroku sang nhánh chủ đề địa phương đó và thực hiện "git đẩy heroku -f" thành chủ nhân viết quá nhiều trên Heroku.

Những gì tôi nhận được từ việc đọc phần "Đẩy lùi" của http://progit.org/book/ch9-5.html

git đẩy -f heroku local-topic-chi nhánh: refs / Heads / master

Điều tôi thực sự thích là một cách để thiết lập điều này trong tệp cấu hình sao cho "git push heroku" luôn làm như trên, thay thế nhánh chủ đề cục bộ bằng tên của bất cứ nhánh nào hiện tại của tôi. Nếu ai biết làm thế nào để thực hiện điều đó, xin vui lòng cho tôi biết!

Tất nhiên, điều cần lưu ý là điều này chỉ hợp lý nếu tôi là người duy nhất có thể đẩy vào ứng dụng / kho lưu trữ Heroku đó. Một nhóm thử nghiệm hoặc QA có thể quản lý một kho lưu trữ như vậy để thử các nhánh ứng cử viên khác nhau, nhưng họ sẽ phải phối hợp để tất cả họ đồng ý về nhánh nào họ sẽ đẩy vào đó vào bất kỳ ngày nào.

Không cần phải nói, nó cũng là một ý tưởng rất tốt để có một kho lưu trữ từ xa riêng biệt (như GitHub) mà không có hạn chế này để sao lưu mọi thứ lên đến. Tôi gọi đó là "nguồn gốc" và sử dụng "heroku" cho Heroku để "git đẩy" luôn sao lưu mọi thứ để xuất phát và "git đẩy heroku" đẩy bất cứ chi nhánh nào tôi hiện đang đến chi nhánh chính của Heroku, ghi đè lên nó Nếu cần.

Điều này sẽ làm việc?

[từ xa "heroku"]
    url = git@heroku.com: my-app.git
    đẩy = + refs / Heads / *: refs / Heads / master

Tôi muốn nghe từ một người có kinh nghiệm hơn trước khi tôi bắt đầu thử nghiệm, mặc dù tôi cho rằng tôi có thể tạo một ứng dụng giả trên Heroku và thử nghiệm điều đó.

Đối với tìm nạp, tôi không thực sự quan tâm nếu kho Heroku chỉ ghi. Tôi vẫn có một kho lưu trữ riêng, như GitHub, để sao lưu và nhân bản tất cả công việc của tôi.

Lưu ý: Câu hỏi này tương tự, nhưng không hoàn toàn giống như triển khai Good Git bằng chiến lược chi nhánh với Heroku?


1
Câu trả lời được bình chọn nhiều nhất hiện nay là cách thức thành ngữ này (và Imo là câu trả lời đúng thực sự)
Selali Adobor

Một tài nguyên https thay thế về việc đẩy refspecs: tài liệu git scm về việc đẩy refspecs .
Dylan Landry

Câu trả lời:


131

Khi sử dụng ký tự đại diện, nó phải có mặt ở cả hai phía của refspec, vì vậy +refs/heads/*:refs/heads/mastersẽ không hoạt động. Nhưng bạn có thể sử dụng +HEAD:refs/heads/master:

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

Ngoài ra, bạn có thể làm điều này trực tiếp với git đẩy :

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

4
Có gì khác biệt giữa hai lệnh này hay chúng ta phải thực hiện cả hai
Saad Masood

2
@SaadMasood: Những người cuối cùng ra git pushlệnh làm điều tương tự. Xem git push --helpý nghĩa của -ftùy chọn và +trong refspec.
Chris Johnsen

4
@Chris Johnson: Bạn có thể vui lòng cho chúng tôi biết các tham số -f có nghĩa là gì thay vì RTFMing các bạn ở đây không?
AHH

@AHH -flà viết tắt của lực lượng . Nó làm việc cho tôi với câu trả lời của jassa .
Ông Tao

@Chris Johnson: Có phải CHÍNH được sử dụng để chỉ phát hành ứng dụng gần đây nhất, thay vì toàn bộ lịch sử?
Cameron Wilby

1566

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

$ git push heroku yourbranch:master

24
Có thể yêu cầu một lực lượng -f.
Scott Stafford

Điều này không còn xuất hiện để làm việc, mặc dù vẫn còn trong tài liệu của họ. Ngay cả khi có lực, máy chủ từ chối việc đẩy rằng họ không thể xóa nhánh chính.
Dave Meehan

3
@DaveMeehan cái này vẫn hoạt động. Bạn đang cố gắng làm điều git push :masterđó để xóa nhánh chủ bằng cách ghi đè lên nó mà không có gì. Điều đó khác với việc ghi đè lên nó với một chi nhánh khác. Heroku có thể có các biện pháp bảo vệ tại chỗ để ngăn chặn việc xóa chi nhánh chính.
Dennis

Đây là một giải pháp tuyệt vời
Ajay Kumar

2
@nxmohamad Không trừ khi chi nhánh của bạn ở phía sau nhánh chính và bạn muốn ghi đè mã hiện tại trên Heroku.
ricks

64
git push -f heroku local_branch_name:master

3
Xem ra, điều này sử dụng -fhoặc --force, và luôn luôn tốt nhất để đảm bảo bạn biết những gì bạn đang làm khi bạn đẩy.
MiFiHiBye

@ tomasz-mazur tại sao nó yêu cầu -f?
nxmohamad

Có, chúng tôi có thể cần sử dụng -f trong một số trường hợp như làm việc với nhiều nhánh đang thực hiện và thay thế bất cứ thứ gì trong heroku và kiểm tra nhánh làm việc, xin vui lòng tư vấn trong trường hợp chúng tôi có cách nào khác tốt hơn để kiểm tra
Fahad

Nó hoạt động trên máy tính của tôi, cảm ơn vì câu trả lời, thực sự cú pháp này có hợp lệ trong kho Github bình thường không?
Luk Aron

10

Lệnh an toàn nhất để đẩy các nhánh Git cục bộ khác nhau đến Heroku / master.

git push -f heroku branch_name:master

Lưu ý: Mặc dù, bạn có thể đẩy mà không cần sử dụng -f, -f (cờ lực) được khuyến nghị để tránh xung đột với các lần đẩy của nhà phát triển khác.


1
bạn không nghĩ rằng đó là cách thực hành tốt hơn để làm mà không có -f trước sao? sau đó nếu có xung đột, trước tiên hãy xác nhận rằng bạn có thể viết lên chúng
nxmohamad

7

Đối với tôi, nó hoạt động,

git push -f heroku otherBranch:master

-F (cờ lực lượng) được khuyến nghị để tránh xung đột với các cú hích của các nhà phát triển khác. Vì bạn không sử dụng Git cho kiểm soát sửa đổi của mình, nhưng với tư cách là phương tiện vận chuyển, sử dụng cờ lực là một cách làm hợp lý.

nguồn: - tài liệu chính thức


5

Cũng lưu ý rằng nếu bạn sử dụng hệ thống luồng git và nhánh tính năng của bạn có thể được gọi

feature/mobile_additions

và với một điều khiển từ xa được gọi là stagingtwo, thì lệnh để đẩy tới heroku sẽ là

git push stagingtwo feature/mobile_additions:master

4

Bạn nên kiểm tra heroku_san , nó giải quyết vấn đề này khá độc đáo.

Ví dụ: bạn có thể:

git checkout BRANCH
rake qa deploy

Nó cũng giúp bạn dễ dàng quay các phiên bản Heroku mới để triển khai một nhánh chủ đề đến các máy chủ mới:

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

Và tất nhiên bạn có thể thực hiện các nhiệm vụ cào đơn giản hơn nếu bạn làm việc gì đó thường xuyên.



1

Các phòng thí nghiệm Heroku hiện cung cấp một tiện ích bổ sung github cho phép bạn chỉ định nhánh nào sẽ đẩy.

Xem Heroku viết lên tính năng beta này.

Bạn sẽ cần phải đăng ký làm người thử nghiệm beta trong thời gian này.


0

Tôi nghĩ nó nên như vậy

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

thay thế...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.