2010-03-08 17 views
15

Estoy tratando de crear una rama de puesta en escena en Heroku, pero hay algo que no entiendo.Git push rama de corriente a un control remoto con Heroku

Suponiendo que ya ha creado una aplicación heroku y fijar el control remoto para que apunte a la estadificación a distancia, si lo hago:

git checkout -b staging staging-remote/master 

me sale una rama local llamado 'puesta en escena' que rastrea puesta en escena a distancia/maestro - o eso es lo que yo pensaba ....

Pero:

git remote show staging-remote 

me da esto:

remote staging 
    Fetch URL: [email protected]:myappname.git 
    Push URL: [email protected]:myappname.git 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    staging-remote merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (up to date) 

Como puede ver, la extracción parece razonable, pero la inserción predeterminada no lo hace. Esto implica que si lo hago:

git push-puesta en escena a distancia

Voy a empujar mi rama maestro local hasta la rama puesta en escena. No

git push staging-remote mybranch:master 

Lo anterior es difícil: pero eso no es lo que quiero .... Básicamente, quiero combinar las actualizaciones en mi rama de puesta en escena, entonces fácilmente empujarlo a heroku sin tener que especificar la rama como tal hacer, pero quiero evitar accidentalmente hacer el empuje anterior y empujar la rama incorrecta ... ¡Esto es doblemente importante para la rama de producción que me gustaría crear!

He intentado jugar con git config, pero no he encontrado la manera de conseguir este derecho aún ...

Respuesta

25

¡Lo he probado y las versiones de @juba y @ MatthewFord funcionan a la perfección!

git config remote.staging.push staging:master 

Esto empuja mi sucursal tema local llamado puesta en escena en rama remota maestro en el repositorio remoto denominado puesta en escena.

@nickgrim la puso en la forma general de este modo:

git config remote.[remoteRepositoryName].push [localBranchName]:[remoteBranchName] 

Actualización:

Además, git moderno muy bien se ejecutará el comando de configuración anterior para cuando git push con la opción -u :

git push -u staging staging:master 
+1

master' en otras palabras: > remoto git config [localBranchName] .push [remotename]:. [RemoteBranchName] –

+2

@DavidAlpert: No, usted tiene que hacia atrás; usted quiere: 'git config remote. [remoteName] .push [localBranchName]: [remoteBranchName]' – nickgrim

+0

@nigkgrim es totalmente correcto. – thekingoftruth

1

Desde la página Everiday Git con 20 comandos o por lo:

http://www.kernel.org/pub/software/scm/git/docs/everyday.html

parece t sombrero que puede lograr lo que quiere hacer mediante la adición de una directiva de configuración para su repositorio Git local, algo así como:

git config remote.staging-remote.push mybranch:refs/remotes/staging-remote/master 

Entonces, si lo hace un git push de su MyBranch rama local, debe ser empujado a maestro rama de puesta en escena remota remota.

Sin embargo, por favor verificar con git remote show staging-remote y probar cuidadosamente antes de usarlo, ya que estoy lejos de ser un experto en git ...

7

tengo una rama llamada heroku, y esto funcionó para mí:

git config remote.heroku.push heroku:master 

el problema al que se enfrenta es heroku ignora todas las ramas que no sean maestra.

0

Estoy teniendo el mismo problema tratando de encontrar la forma de lidiar con la política de Heroku de ignorar todas las ramas, pero 'maestro'.Es un poco contrario al objetivo de mantener ramas separadas si solo puedes probar la rama principal en Heroku.

La consecuencia de esta restricción es que cualquiera que sea la rama de tema local en la que esté trabajando, me gustaría una forma fácil de cambiar el maestro de Heroku a esa rama de tema local y hacer un "git push -f" para sobrescribir maestro en Heroku. Huelga decir que sería una muy buena idea tener un repositorio remoto separado (como Github) para respaldar todo sin esta restricción. Yo llamaría a ese "origen" y usaría "heroku" para Heroku para que "git push" siempre respaldara todo.

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

git push heroku locales-tema-rama: refs/heads/master

Lo que realmente me gustaría es una manera de configúrelo 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 que sea mi rama actual.

Puedo hacer esto como una nueva pregunta, para ver si alguien más ha descubierto cómo hacerlo.

+1

'git config CABEZA remote.heroku.push: –

3

del libro "O'Reilly - Control de versiones con Git" página 184 | Capítulo 11: repositorios remotos

Durante una operación de git push, normalmente se desea proporcionar y publicar los cambios que ha realizado en sus ramas puntuales locales. Para permitir que otros encuentren sus cambios en el repositorio remoto después de subirlos, sus cambios deben aparecer en ese repositorio como ramas de tema. De este modo, durante una típica comando git push, las ramas de código de su repositorio se envían al repositorio remoto utilizando un refspec tales como:

+refs/heads/*:refs/heads/* 

Este refspec puede parafrasearse como: Desde el repositorio local, tome cada nombre de sucursal que se encuentra en el espacio de nombres de origen refs/heads/ y colóquelo en una rama coincidente con el mismo nombre bajo el espacio de nombres de destino refs/heads/ en el repositorio remoto. El primer refs/heads/ se refiere a su repositorio local (porque está ejecutando un push), y el segundo se refiere al repositorio remoto. Los asteriscos aseguran que se repliquen todas las ramas . ...


Es por eso que el ejemplo de Juba debe fallar. el refspec corregido debe ser:

git config remote.staging-remote.push +refs/heads/local_branch_name:refs/heads/master 
0

Esto funciona. Lo he usado más de unas pocas veces para configurar clientes con git-flow, heroku y un servicio de copia de seguridad.

.git/config para el repositorio:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    ignorecase = true 
[heroku] 
    account = youraccount 
[remote "origin"] 
    url = [email protected]:youruser/yoursite.heroku.com.git # or github, etc. 
    fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
[branch "staging"] 
    remote = origin 
    merge = refs/heads/staging 
[branch "develop"] 
    remote = origin 
    merge = refs/heads/develop 
[remote "production"] 
    pushurl = [email protected]:your-prod-app.git 
    push = master:master 
[remote "staging"] 
    pushurl = [email protected]:your-staging-app.git 
    push = staging:master 

Todo funciona correctamente:

git push origin

git pull origin

git push staging

git push production

Piense en buscar y presionar como stdout y stdin, donde ambos pueden redirigirse o cerrarse para ser de una sola dirección. Además, si alguien sabe cómo obtener estos ajustes sin hackear .git/config, por favor, siéntase libre de modificarlos con una edición, seguramente seguirán puntos de karma.

Cuestiones relacionadas