2011-10-09 12 views
5

Acabo de comenzar a escribir una aplicación web.usando git hook después del commit

Estoy usando GIT para control de versiones y tengo git y servidor web en la misma computadora.

aplicación cuenta con 3 ambientes: dev, prueba y producción

quiero usar Git gancho después de cada confirmación para actualizar dev, prueba o aplicación de producción.

¿cuál es la mejor práctica para esto?

necesito algo como esto:

  1. cuando me comprometo, Dev debe ser actualizado automáticamente
  2. cuando el mensaje del informe contiene "prueba:" delante del mensaje - dev y la prueba debe ser actualizado.
  3. cuando el mensaje de confirmación contiene "producción:" delante del mensaje - la producción, el desarrollo y la prueba deben actualizarse.

¡Gracias!

+4

Solo una sugerencia (porque se siente más consistente y más fácil): utilice un _branch_ para dev, uno para prueba y uno para producción. Cada vez que presione para "probar" un gancho debe actualizar su entorno de prueba (y así sucesivamente). – KingCrunch

+0

gracias por compartir su sugerencia – Irakli

Respuesta

1

acabo de escribir un mini script gancho/bash para resolver este problema

#!/bin/bash 

if git log --pretty=format:%s -1 | grep -q "^test: " 
then 
    #action/update dev/test 
elif git log --pretty=format:%s -1 | grep -q "^production: " 
then 
    #action/update dev/test/production 
else 
    #action/update dev 
fi 

Es mi primera escritura del golpe así .. por favor ayuda a mejorar esta :)

+0

Usar 'git checkout -f' aquí podría ser útil. – jackyalcine

1

Puede escribir un post-commit hook que analizar el mensaje de confirmación utilizando algo como git log -1 --format=%B y realizar la acción apropiada como git push dev etc.

Si se trata de empujar sus compromete a una cesión temporal centralizado a distancia y ese repositorio tiene que hacer esto, entonces usted tiene que usar un gancho post-receive de una manera similar. Tenga en cuenta que los enganches commit se ejecutan en el repositorio del cliente donde se confirma.

Dicho esto, presionar a los entornos utilizando lo que dices en el mensaje no es un flujo de trabajo adecuado. Puede tener diferentes ramas, donde puede elegir sus commits, etc. Puede configurar ganchos de modo que cuando presione en la rama test, el entorno de prueba se actualice y así sucesivamente.

+0

¡Gracias! Me has ayudado – Irakli

+0

Me has ayudado, pero no es una respuesta completa. Por favor revisa mi nueva publicación sobre este problema. ¡Gracias de nuevo! – Irakli

2

Sobre la base de la idea Irakli , esto es lo que he de trabajar como un post-recibo en mi repo ...

#!/bin/bash 

MESSAGE=$(git log -1 HEAD --pretty=format:%s) 

if [[ "$MESSAGE" == *\[staging\]* ]]; 
then 
    #action/update staging 
    # another method not being used... 
    # GIT_WORK_TREE=/path/to/working/site/ git checkout -q -f staging 
    echo "NOTE: Beginning Auto-Push to Staging Server... " 
    `git push staging` 
    echo "======================================================== 
======== Done! Pushed to STAGING.com ============= 
======== Thanks Captain. Keep up the good work! ======== 
========================================================" 
elif [[ "$MESSAGE" == *\[production\]* ]]; 
then 
    #action/update production 
    echo "NOTE: Beginning Auto-Push to Production Server... " 
    # `git push production` 
    echo "======================================================== 
======== Done!!! Pushed to Production.com ======= 
======== Test immediately for any errors! ========= 
========================================================" 
fi 

Nota:

para hacer que funcione el 'git push staging', necesitas tener un gancho .git/hooks/post-reveive en ese árbol de trabajo. Usé this code excepto que agregué 'umask 002 & & git reset --hard' en la parte inferior.

También he tenido que añadir un archivo a denyrecive .git/config de ese árbol de trabajo:

[receive] 
    denycurrentbranch = ignore 

Nota 2:

Tenga en cuenta esta configuración no es para todos ... para vehículos pequeños (ish) sitios donde las actualizaciones sucias & rápidas están bien.