Как перенести разные локальные ветки Git в Heroku / master

402

Heroku придерживается политики игнорирования всех ветвей, кроме «master».

Хотя я уверен, что у дизайнеров Heroku есть веские причины для этой политики (я предполагаю, что для хранения и оптимизации производительности), для меня как для разработчика следствием является то, что в какой-либо локальной ветке тем, над которой я могу работать, я бы хотел легкий путь переключить мастера Heroku на эту локальную ветку и выполнить команду «git push heroku -f», чтобы перезаписать мастер на Heroku.

Что я получил, прочитав раздел «Pushing Refspecs» на http://progit.org/book/ch9-5.html :

git push -f heroku local-topic-branch: refs / возглавляет / мастер

Что мне действительно нравится, так это способ установить это в файле конфигурации так, чтобы «git push heroku» всегда делал вышеуказанное, заменяя local-topic-branch на имя того, кем является моя текущая ветка. Если кто-нибудь знает, как этого добиться, пожалуйста, дайте мне знать!

Предостережение для этого, конечно, заключается в том, что это разумно, только если я единственный, кто может перейти к этому приложению / репозиторию Heroku. Команда тестирования или QA может управлять таким репозиторием, чтобы опробовать разные ветви-кандидаты, но им придется координировать свои действия, чтобы они все сошлись во мнении, какую ветку они продвигают в данный день.

Излишне говорить, что было бы очень неплохо иметь отдельный удаленный репозиторий (например, GitHub) без этого ограничения для резервного копирования всего. Я бы назвал это «происхождение» и использовал бы «heroku» для Heroku, так что «git push» всегда копирует все в начало, а «git push heroku» помещает любую ветвь, в которой я сейчас нахожусь, в главную ветку Heroku, перезаписывая ее если необходимо.

Будет ли это работать?

[удаленная "герока"]
    url = git@heroku.com: my-app.git
    нажать = + ссылки / головы / *: ссылки / головы / мастер

Я хотел бы услышать от кого-то более опытного, прежде чем я начну экспериментировать, хотя я полагаю, что мог бы создать фиктивное приложение на Heroku и поэкспериментировать с этим.

Что касается извлечения, то мне все равно, доступен ли репозиторий Heroku только для записи. У меня все еще есть отдельный репозиторий, такой как GitHub, для резервного копирования и клонирования всей моей работы.

Сноска. Этот вопрос похож на развертывание Good Git с использованием стратегии ветвления с Heroku , но не совсем так ?

Лоуренс И. Сиден
источник
1
Ответ, получивший наибольшее количество голосов, - идиоматический способ сделать это (и, по-
моему,
Альтернативный ресурс https о продвижении refspecs: git scm документация о продвижении refspecs .
Дилан Лэндри

Ответы:

131

При использовании подстановочного знака он должен присутствовать с обеих сторон 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
какая разница между этими двумя командами или мы должны выполнять обе
Саад Масуд
2
@SaadMasood: последние git pushкоманды делают то же самое. Смотрите git push --helpзначение -fопции и +в refspec.
Крис Джонсен
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
Jassa
источник
24
Может потребоваться сила.
Скотт Стаффорд
Похоже, это больше не работает, несмотря на то, что они все еще в своих документах. Даже с применением силы сервер отклоняет запрос, говоря, что он не может удалить главную ветвь.
Дейв Михан
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

Примечание. Несмотря на то, что вы можете использовать push без использования -f, рекомендуется использовать флаг -f (force), чтобы избежать конфликтов с другими разработчиками.

techdreams
источник
1
ты не думаешь, что лучше сначала обойтись без -f? затем, если есть конфликты, сначала подтвердите, что можно писать поверх них
nxmohamad
8

Для меня это работает,

git push -f heroku otherBranch:master

-F (флаг принудительной установки) рекомендуется, чтобы избежать конфликтов с другими разработчиками. Поскольку вы используете Git не для контроля версий, а только для транспорта, использование флага принудительного применения является разумной практикой.

источник: - официальные документы

Ашад Насим
источник
5

Также обратите внимание, что если вы используете систему git flow и ваша ветвь возможностей, может быть вызвано

feature/mobile_additions

и с помощью git remote под названием 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

И, конечно, вы можете делать более простые рейк-задачи, если часто что-то делаете.

JQR
источник
0

Я думаю, что это должно быть

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

вместо...

кругозор
источник