Як підштовхнути різні місцеві гіти Git до Heroku / master


402

У Heroku проводиться політика ігнорування всіх гілок, крім "господаря".

Хоча я впевнений, що у дизайнерів Heroku є чудові причини цієї політики (я здогадуюсь про оптимізацію зберігання та продуктивності), наслідком для мене як розробника є те, що над якою локальною тематичною галуззю я можу працювати, я хотів би простий спосіб щоб переключити майстра Heroku в ту місцеву гілку теми і зробити "git push heroku -f", щоб переписати майстра на Heroku.

Що я отримав, читаючи розділ "Pushhing Refspecs" 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, перезаписуючи її якщо необхідно.

Це працювало б?

[віддалена "геройка"]
    url = git@heroku.com: мій-app.git
    push = + refs / heads / *: refs / heads / master

Мені хотілося б почутись від когось більш досвідченого, перш ніж почати експериментувати, хоча, мабуть, я міг би створити додаток на манекені на Heroku і експериментувати з цим.

Щодо вилучення, мені не дуже важливо, чи сховище Heroku призначене лише для запису. У мене все ще є окремий сховище, як GitHub, для резервного копіювання та клонування всієї моєї роботи.

Виноска: Це питання схоже на, але не зовсім таке, як розгортання Good Git із використанням гілок стратегії з Heroku?


1
На даний момент найбільш голосована відповідь - це ідіоматичний спосіб зробити це (і я справжню правильну відповідь)
Селалі Абобор

Альтернативний ресурс https про підштовхування refspecs: git scm документація про підштовхування refspecs .
Ділан Ландрі

Відповіді:


131

Під час використання підстановки він повинен бути присутнім з обох боків респекту, тому +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
яка різниця між цими двома командами чи ми повинні виконувати обидві
Саад Масуд,

2
@SaadMasood: Останні git pushкоманди, які роблять те саме, Ознайомтесь git push --helpіз значенням -fваріанту та +рефлексу.
Кріс Джонсен

4
@Chris Johnson: Скажіть, будь ласка, що означають параметри -f замість RTFMing хлопців тут?
AHH

@AHH -fозначає силу . Це працювало на мене з відповіддю Джасса .
Містер Тао

@Chris Johnson: Чи HEAD використовується лише для просування останнього випуску програми, а не всієї історії?
Камерон Вілбі

1566

Дивіться https://devcenter.heroku.com/articles/git#deploying-code

$ git push heroku yourbranch:master

24
Може знадобитися сила -f.
Скотт Стаффорд,

Це, здається, більше не працює, незважаючи на те, що він ще знаходиться у своїх документах. Навіть із силою сервер відхиляє натискання, кажучи, що він не може видалити головну гілку.
Дейв Мейхан

3
@DaveMeehan це все ще працює. Ви намагаєтесь git push :masterвидалити головну гілку, перезаписавши її нічим. Це інакше, ніж перезапис його іншою гілкою. У Heroku, ймовірно, є гарантії для запобігання видаленню ведучої гілки.
Денніс

Це дивовижне рішення
Аджай Кумар

2
@nxmohamad Це не виходить, якщо ваша гілка позаду головного відділення, і ви не захочете змінити поточний код на Heroku.
рик

64
git push -f heroku local_branch_name:master

3
Будьте уважні, це використовує -fабо --force, і завжди краще, щоб ви знали, що ви робите, коли ви змушуєте натискати.
MiFiHiBye

@ tomasz-mazur, чому він вимагає -f?
nxmohamad

Так, нам може знадобитися використання -f у деяких випадках, як робота з кількома незавершеними гілками і замінити те, що відбувається в heroku і протестувати робочу гілку, будь ласка, порадьте, чи є у нас ще якийсь кращий спосіб тестування
Fahad

це працює на моєму комп’ютері, дякую за відповідь, чи справді цей синтаксис дійсний у звичайному сховищі Github?
Лук Арон

10

Найбезпечніша команда підштовхувати різні локальні гіти Git до Heroku / master.

git push -f heroku branch_name:master

Примітка. Хоча ви можете натискати, не використовуючи -f, рекомендується -f (сила прапора), щоб уникнути конфліктів із натисканнями інших розробників.


1
ти не вважаєш, що кращою практикою обійтися без першого? тоді, якщо є конфлікти, спочатку підтвердити, що добре писати над ними
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

І звичайно, ви можете робити більш прості завдання з граблями, якщо щось робите часто.




0

Я думаю, що так і має бути

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

натомість ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.