Jak wypchnąć różne lokalne gałęzie Git do Heroku / master


402

Heroku ma politykę ignorowania wszystkich gałęzi oprócz „master”.

Chociaż jestem pewien, że projektanci Heroku mają doskonałe powody dla tych zasad (zgaduję pod kątem optymalizacji pamięci i wydajności), konsekwencją dla mnie jako programisty jest to, że niezależnie od gałęzi lokalnego tematu, nad którą mogę pracować, chciałbym w łatwy sposób aby przełączyć wzorzec Heroku na lokalną gałąź tematyczną i wykonać polecenie „git push heroku -f”, aby nadpisać wzorzec Heroku.

To, co uzyskałem po przeczytaniu sekcji „Pushing Refspecs” http://progit.org/book/ch9-5.html, to

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

To, co naprawdę chciałbym, to sposób na skonfigurowanie tego w pliku konfiguracyjnym, tak aby „git push heroku” zawsze robi powyższe, zastępując gałąź lokalnego tematu nazwą jakiejkolwiek mojej obecnej gałęzi. Jeśli ktoś wie, jak to osiągnąć, daj mi znać!

Zastrzeżeniem tego jest oczywiście to, że jest to rozsądne tylko wtedy, gdy jestem jedynym, który może naciskać na tę aplikację / repozytorium Heroku. Zespół testowy lub zespół kontroli jakości może zarządzać takim repozytorium, aby wypróbować różne gałęzie kandydatów, ale będą musieli koordynować, aby wszyscy uzgodnili, do której gałęzi pchają go w danym dniu.

Nie trzeba dodawać, że bardzo dobrym pomysłem byłoby posiadanie oddzielnego zdalnego repozytorium (takiego jak GitHub) bez tego ograniczenia tworzenia kopii zapasowej wszystkiego. Nazwałbym to jedno „początkiem” i użyłem „heroku” dla Heroku, aby „git push” zawsze tworzyło kopię zapasową wszystkiego do pochodzenia, a „git push heroku” wypycha dowolną gałąź, w której aktualnie się znajduję, do gałęzi głównej Heroku, zastępując ją Jeśli to konieczne.

Czy to zadziała?

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

Chciałbym usłyszeć od kogoś bardziej doświadczonego, zanim zacznę eksperymentować, chociaż przypuszczam, że mógłbym stworzyć na Heroku aplikację-atrapę i eksperymentować z tym.

Jeśli chodzi o pobieranie, nie obchodzi mnie, czy repozytorium Heroku jest tylko do zapisu. Nadal mam osobne repozytorium, takie jak GitHub, do tworzenia kopii zapasowych i klonowania całej mojej pracy.

Przypis: To pytanie jest podobne, ale nie do końca takie samo jak wdrożenie Good Git przy użyciu strategii oddziałów w Heroku?


1
Najczęściej głosowaną odpowiedzią jest idiomatyczny sposób na zrobienie tego (i
imo

Alternatywny zasób https o wypychaniu refspecs: dokumentacja git scm na temat wypychania refspecs .
Dylan Landry

Odpowiedzi:


131

Gdy używasz symbolu wieloznacznego, musi on znajdować się po obu stronach refspec, więc +refs/heads/*:refs/heads/masternie będzie działać. Ale możesz użyć +HEAD:refs/heads/master:

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

Możesz to również zrobić bezpośrednio za pomocą git push :

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

4
jaka jest różnica między tymi dwoma poleceniami, czy musimy wykonać oba
Saad Masood,

2
@ SaadMasood: Ci, którzy git pushwykonują polecenia, robią to samo. Zobacz git push --helpznaczenie -fopcji i +refspec.
Chris Johnsen

4
@ Chris Johnson: Czy możesz nam powiedzieć, co oznaczają parametry -f zamiast RTFMing tutaj?
AHH,

@AHH -foznacza siłę . To zadziałało dla mnie z odpowiedzią Jassy .
Pan Tao

@Chris Johnson: Czy HEAD wypycha najnowszą wersję aplikacji, a nie całą historię?
Cameron Wilby

1566

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

$ git push heroku yourbranch:master

24
Może wymagać użycia siły -f.
Scott Stafford,

Wydaje się, że to już nie działa, mimo że nadal są w swoich dokumentach. Nawet z siłą serwer odrzuca push, mówiąc, że nie może usunąć gałęzi master.
Dave Meehan

3
@DaveMeehan to nadal działa. Próbujesz zrobić to, git push :masterco usuwa gałąź master, nadpisując ją niczym. To różni się od zastąpienia go innym oddziałem. Prawdopodobnie Heroku ma zabezpieczenia zapobiegające usunięciu gałęzi master.
Dennis

To niesamowite rozwiązanie
Ajay Kumar

2
@ nxmohamad Nie dzieje się tak, chyba że twoja gałąź znajduje się za gałęzią główną i nie chcesz zastąpić bieżącego kodu w Heroku.
ricks

64
git push -f heroku local_branch_name:master

3
Uważaj, to używa -flub --force, i zawsze najlepiej jest upewnić się, że wiesz, co robisz, gdy naciskasz.
MiFiHiBye

@ tomasz-mazur dlaczego wymaga -f?
nxmohamad

Tak, może być konieczne użycie -f w niektórych przypadkach, takich jak praca z wieloma gałęziami w toku i zamiana wszystkiego w heroku i przetestowanie działającej gałęzi, prosimy o poradę na wypadek, gdybyśmy mieli inny lepszy sposób na przetestowanie
Fahad

działa na moim komputerze, dzięki za odpowiedź, czy ta składnia jest poprawna w normalnym repozytorium Github?
Luk Aron

10

Najbezpieczniejsze polecenie wypychania różnych lokalnych gałęzi Git do Heroku / master.

git push -f heroku branch_name:master

Uwaga: Chociaż możesz przepychać bez użycia opcji -f, zalecane jest użycie opcji -f (flaga wymuszenia), aby uniknąć konfliktów z działaniami innych programistów.


1
nie sądzisz, że lepiej jest najpierw zrezygnować z opcji -f? jeśli są konflikty, najpierw potwierdź, że można nad nimi pisać
nxmohamad 27.02.19

7

Dla mnie to działa,

git push -f heroku otherBranch:master

Opcja -f (flaga siły) jest zalecana w celu uniknięcia konfliktów z pchnięciami innych programistów. Ponieważ nie używasz Gita do kontroli wersji, a jedynie jako transportu, użycie flagi siły jest rozsądną praktyką.

źródło: - oficjalne dokumenty


5

Zauważ też, że jeśli używasz systemu git flow i gałęzi funkcji, możesz się nazywać

feature/mobile_additions

i przy pomocy git-zdalnego zwanego stagingtwo, wtedy poleceniem push to heroku byłoby

git push stagingtwo feature/mobile_additions:master

4

Powinieneś sprawdzić heroku_san , to całkiem ładnie rozwiązuje ten problem.

Na przykład możesz:

git checkout BRANCH
rake qa deploy

Ułatwia także tworzenie nowych instancji Heroku w celu wdrożenia gałęzi tematycznej na nowych serwerach:

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

I oczywiście możesz wykonywać prostsze zadania prowizji, jeśli robisz coś często.




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.