Como enviar diferentes ramificações locais do Git para o Heroku / master

402

Heroku tem uma política de ignorar todos os ramos, exceto o 'mestre'.

Embora eu tenha certeza de que os designers da Heroku têm excelentes razões para essa política (eu acho que otimizo o armazenamento e o desempenho), a consequência para mim como desenvolvedor é que, seja qual for o ramo de tópico local em que eu esteja trabalhando, eu gostaria de uma maneira fácil para mudar o mestre do Heroku para esse tópico local e fazer um "git push heroku -f" para sobrescrever o mestre no Heroku.

O que obtive da leitura da seção "Pushing Refspecs" em http://progit.org/book/ch9-5.html é

git push -f heroku local-tópico-ramo: refs / heads / master

O que eu realmente gostaria é de uma maneira de definir isso no arquivo de configuração para que "git push heroku" sempre faça o acima, substituindo local-topic-branch pelo nome de qualquer que seja o meu branch atual. Se alguém souber como fazer isso, entre em contato!

A ressalva para isso, é claro, é que isso só é sensato se eu for o único que pode empurrar para esse aplicativo / repositório Heroku. Uma equipe de teste ou controle de qualidade pode gerenciar esse repositório para testar diferentes filiais candidatas, mas elas precisam se coordenar para que todos concordem com qual filial estão enviando para ela em um determinado dia.

Desnecessário dizer que também seria uma boa idéia ter um repositório remoto separado (como o GitHub) sem essa restrição para fazer backup de tudo. Eu chamaria essa de "origem" e usaria "heroku" para o Heroku para que "git push" sempre faça backup de tudo para a origem, e "git push heroku" empurra qualquer ramo que eu esteja atualmente no ramo mestre do Heroku, sobrescrevendo-o se necessário.

Isso funcionaria?

[remoto "heroku"]
    url = [email protected]: my-app.git
    push = + refs / chefes / *: refs / chefes / mestre

Eu gostaria de ouvir alguém mais experiente antes de começar a experimentar, embora suponha que possa criar um aplicativo fictício no Heroku e experimentar isso.

Quanto à busca, eu realmente não me importo se o repositório Heroku é somente para gravação. Eu ainda tenho um repositório separado, como o GitHub, para backup e clonagem de todo o meu trabalho.

Nota de rodapé: Esta pergunta é semelhante, mas não é a mesma que a implantação do Good Git usando a estratégia de ramos com o Heroku?

Lawrence I. Siden
fonte
11
A resposta atualmente mais votada é a maneira idiomática de fazer isso (e Imo a resposta correta real)
Selali Adobor
Um recurso https alternativo sobre o envio de refspecs: documentação do git scm sobre o envio de refspecs .
Dylan Landry #

Respostas:

131

Ao usar um curinga, ele deve estar presente nos dois lados do refspec, portanto +refs/heads/*:refs/heads/masternão funcionará. Mas você pode usar +HEAD:refs/heads/master:

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

Além disso, você pode fazer isso diretamente com o git push :

git push heroku +HEAD:master
git push -f heroku HEAD:master
Chris Johnsen
fonte
4
Qual a diferença btween esses dois comandos ou temos de realizar ambas
Saad Masood
2
@SaadMasood: Os últimos a git pushcomandar fazem a mesma coisa. Veja git push --helpo significado da -fopção e +no refspec.
31813 Chris Johnsen
4
@ Chris Johnson: Você poderia nos dizer o que os parâmetros -f significam em vez de RTFMing para os caras aqui?
AHH
@AHH -fsignifica força . Funcionou para mim com a resposta de jassa .
Sr. Tao
@ Chris Johnson: O HEAD é usado apenas para lançar a versão mais recente do aplicativo, em vez de toda a história?
Cameron Wilby
1566

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

$ git push heroku yourbranch:master
jassa
fonte
24
Pode exigir uma força -f.
Scott Stafford
Isso não parece mais funcionar, apesar de ainda estar nos documentos. Mesmo com força, o servidor rejeita o envio dizendo que não pode excluir a ramificação principal.
18715 Dave Meehan
3
@DaveMeehan isso ainda funciona. Você está tentando fazer o git push :masterque exclui o ramo principal substituindo-o por nada. Isso é diferente de substituí-lo por outro ramo. Heroku provavelmente possui salvaguardas para impedir a exclusão da ramificação principal.
Dennis
Esta é uma solução incrível
Ajay Kumar
2
@nxmohamad Não, a menos que sua ramificação esteja atrás da ramificação principal e você queira substituir o código atual no Heroku.
ricks
64
git push -f heroku local_branch_name:master
Tomasz Mazur
fonte
3
Cuidado, isso usa -fou --force, e é sempre melhor garantir que você saiba o que está fazendo quando pressiona.
MiFiHiBye
@ tomasz-mazur por que requer -f?
Nxmohamad 21/09/2017
Sim nós pode precisar usar -f em alguns casos, como trabalhar com várias ramificações em andamento e substituir o que quer em heroku e testar o ramo de trabalho, por favor, aconselhamento em caso temos qualquer outra maneira melhor de teste
Fahad
funciona no meu computador, obrigado pela resposta, na verdade essa sintaxe é válida no repositório normal do Github?
Luk Aron
10

O comando mais seguro para enviar diferentes ramificações locais do Git para o Heroku / master.

git push -f heroku branch_name:master

Nota: Embora você possa pressionar sem usar o -f, o -f (sinalizador de força) é recomendado para evitar conflitos com os push de outros desenvolvedores.

techdreams
fonte
11
você não acha que é melhor praticar sem o -f primeiro? em seguida, se houver conflitos, a primeira confirmação de que não há problema em escrever sobre eles
nxmohamad
7

Para mim, funciona,

git push -f heroku otherBranch:master

O -f (sinalizador de força) é recomendado para evitar conflitos com os empurrões de outros desenvolvedores. Como você não está usando o Git para seu controle de revisão, mas apenas como transporte, o uso do sinalizador de força é uma prática razoável.

fonte: - documentos oficiais

Ashad Nasim
fonte
5

Observe também que, se você estiver usando o sistema git flow e seu ramo de recursos, pode ser chamado

feature/mobile_additions

e com um controle remoto git chamado stagingtwo, o comando para enviar ao heroku seria

git push stagingtwo feature/mobile_additions:master
Jonathon Batson
fonte
4

Você deve verificar o heroku_san , ele resolve esse problema muito bem.

Por exemplo, você pode:

git checkout BRANCH
rake qa deploy

Também facilita a criação de novas instâncias Heroku para implantar uma ramificação de tópico em novos servidores:

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

E é claro que você pode fazer tarefas mais simples de rake se fizer algo com frequência.

jqr
fonte
0

Eu acho que deveria ser

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

em vez de...

ken
fonte