Cómo empujar diferentes sucursales locales de Git a Heroku / master


402

Heroku tiene una política de ignorar todas las ramas, excepto "maestro".

Si bien estoy seguro de que los diseñadores de Heroku tienen excelentes razones para esta política (supongo que el almacenamiento y la optimización del rendimiento), la consecuencia para mí como desarrollador es que, sea cual sea la rama de tema local en la que esté trabajando, me gustaría una manera fácil para cambiar el maestro de Heroku a esa rama de tema local y hacer un "git push heroku -f" para sobrescribir el maestro en Heroku.

Lo que obtuve al leer la sección "Pushing Refspecs" de http://progit.org/book/ch9-5.html es

git push -f heroku rama-tema-local: referencias / cabezas / maestro

Lo que realmente me gustaría es una forma de configurar esto en el archivo de configuración para que "git push heroku" siempre haga lo anterior, reemplazando local-topic-branch con el nombre de lo que sea mi rama actual. Si alguien sabe cómo lograrlo, ¡hágamelo saber!

La advertencia para esto, por supuesto, es que esto solo es sensato si soy el único que puede acceder a esa aplicación / repositorio de Heroku. Un equipo de prueba o de control de calidad puede administrar dicho repositorio para probar diferentes ramas candidatas, pero tendrían que coordinarse para que todos estén de acuerdo en qué rama están presionando en un día determinado.

Huelga decir que también sería una muy buena idea tener un repositorio remoto separado (como GitHub) sin esta restricción para hacer una copia de seguridad de todo. Llamaría a ese "origen" y usaría "heroku" para Heroku para que "git push" siempre respalde todo al origen, y "git push heroku" empuje cualquier rama en la que estoy actualmente a la rama maestra de Heroku, sobrescribiéndola si necesario.

¿Funcionaría esto?

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

Me gustaría saber de alguien más experimentado antes de comenzar a experimentar, aunque supongo que podría crear una aplicación ficticia en Heroku y experimentar con eso.

En cuanto a la búsqueda, no me importa si el repositorio de Heroku es de solo escritura. Todavía tengo un repositorio separado, como GitHub, para realizar copias de seguridad y clonar todo mi trabajo.

Nota al pie: ¿Esta pregunta es similar, pero no exactamente igual a la implementación de Good Git usando la estrategia de sucursales con Heroku?


1
La respuesta más votada actualmente es la forma idiomática de hacer esto (e Imo, la respuesta correcta real)
Selali Adobor

Un recurso https alternativa de empujar refspecs: documentación SMC git de empujar refspecs .
Dylan Landry el

Respuestas:


131

Al usar un comodín, tenía que estar presente en ambos lados de la especificación de referencia, por +refs/heads/*:refs/heads/masterlo que no funcionará. Pero puedes usar +HEAD:refs/heads/master:

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

Además, puede hacer esto directamente con git push :

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

44
¿Cuál es la diferencia entre estos dos comandos o tenemos que llevar a cabo ambos?
Saad Masood

2
@SaadMasood: los últimos en recibir git pushcomandos hacen lo mismo. Vea git push --helpel significado de la -fopción y el +en la refspec.
Chris Johnsen

44
@Chris Johnson: ¿Podría decirnos qué significan los parámetros -f en lugar de RTFMinging a los chicos aquí?
AHH

@AHH -fsignifica fuerza . A mí me funcionó con la respuesta de Jassa .
Sr. Tao

@Chris Johnson: ¿HEAD solo utiliza la versión más reciente de la aplicación, en lugar de toda la historia?
Cameron Wilby

1566

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

$ git push heroku yourbranch:master

24
Puede requerir una fuerza -f.
Scott Stafford

Esto ya no parece funcionar, a pesar de estar todavía en sus documentos. Incluso con fuerza, el servidor rechaza el envío diciendo que no puede eliminar la rama maestra.
Dave Meehan

3
@DaveMeehan esto todavía funciona. Estás intentando hacer lo git push :masterque elimina la rama maestra sobrescribiéndola sin nada. Eso es diferente a sobrescribirlo con otra rama. Heroku probablemente tiene salvaguardas para evitar la eliminación de la rama maestra.
Dennis

Esta es una solución increíble
Ajay Kumar

2
@nxmohamad No lo hace a menos que su rama esté detrás de la rama maestra y desee anular el código actual en Heroku.
ricks

64
git push -f heroku local_branch_name:master

3
Tenga cuidado, esto usa -fo --force, y siempre es mejor asegurarse de saber lo que está haciendo cuando fuerza el empuje.
MiFiHiBye

@ tomasz-mazur ¿por qué requiere -f?
nxmohamad

Sí, es posible que necesitemos usar -f en algunos casos, como trabajar con varias ramas en progreso y reemplazar lo que sea en heroku y probar la rama de trabajo, por favor, consejo en caso de que tengamos otra forma mejor de probar
Fahad

funciona en mi computadora, gracias por la respuesta, ¿es esta sintaxis válida en el repositorio normal de Github?
Luk Aron

10

El comando más seguro para enviar diferentes ramas locales de Git a Heroku / master.

git push -f heroku branch_name:master

Nota: aunque puede presionar sin usar -f, se recomienda -f (indicador de fuerza) para evitar conflictos con las presiones de otros desarrolladores.


1
¿No crees que es mejor practicar sin el -f primero? luego, si hay conflictos, para confirmar primero que está bien escribir sobre ellos
nxmohamad

7

Para mi funciona

git push -f heroku otherBranch:master

Se recomienda -f (indicador de fuerza) para evitar conflictos con los empujes de otros desarrolladores. Como no está utilizando Git para su control de revisión, sino solo como transporte, usar la bandera de fuerza es una práctica razonable.

fuente: - documentos oficiales


5

También tenga en cuenta que si usa el sistema git flow y su rama de características podría llamarse

feature/mobile_additions

y con un control remoto git llamado stagingtwo, entonces el comando para empujar a heroku sería

git push stagingtwo feature/mobile_additions:master

4

Deberías revisar heroku_san , resuelve este problema bastante bien.

Por ejemplo, podrías:

git checkout BRANCH
rake qa deploy

También facilita la conexión de nuevas instancias de Heroku para implementar una rama temática en nuevos servidores:

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

Y, por supuesto, puede hacer tareas de rastrillo más simples si hace algo con frecuencia.




0

Creo que debería ser

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

en lugar...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.