Git hook para actualizar varias carpetas web basadas en la twig enviada al server remoto

Estoy desarrollando una aplicación web que utiliza Gitosis (Debian Lenny) que deseo poder enviar a diferentes repositorys / ubicaciones remotas, lo que permite una versión de la aplicación "de última generación", "candidato a publicación" y "producción". directorys web físicos reflejados y base de código. Preferiría que cada directory tenga una twig de la aplicación. Así que un repository, tres versiones "en vivo".

Soy nuevo en Git, así que probablemente haya una solución mejor, pero lo que he encontrado hasta ahora es encontrar una forma de conectar ganchos a las twigs (que no he encontrado) o escribir un gancho que filtrará para qué la twig está siendo comprometida.

Mi pregunta es cómo configurar un gancho post-actualización que verificará la twig comprometida, establecerá una variable para el directory basado en esa twig, y ​​literalmente copyrá la base de código en ese directory donde se puede acceder de manera instantánea a través de HTTP.

git rev-list --branches --pretty=oneline --max-count=1 

devolverá algo como:

 cc5112ba59bc82f2e847ac264317c062ce80f69f test commit 

pero necesito el nombre de la twig como "experimental" o "maestro".

Básicamente, estoy buscando algo como:

1) Obtener el nombre de la twig que acaba de comprometerse (por ejemplo, "maestro", "experimental") en una cadena

2) Use el caso Bash para declarar qué directory usar

3) Ejecute algo como "git archive –format = alquitrán HEAD | (cd $ LOCATION && tar xf -)" donde la location es lo que se devolvió del caso.

Creí que me estaba acercando con lo siguiente, pero me di count de que no devolvía el nombre de la twig, sino el post de confirmación:

 #!/bin/sh # Get substr from "sha1[space]commit-msg" BRANCH=$(git rev-list --pretty=oneline --branches --max-count=1 | awk '{split($0,array," ")} END{print array[2]}') case $BRANCH in "experimental") dir="/home/APP_NAME/experimental" ;; "master") dir="/home/APP_NAME/production" ;; esac # move to location and copy files git archive --format=tar HEAD | (cd $loc && tar xf -) 

Me di count de que si siempre pongo la twig como la primera parte del compromiso, podría lograr algo como esto, pero realmente no quiero preocuparme por ello.

Cualquier ayuda sería apreciada. ¡Gracias por adelantado!

En caso de presionar a un repository no desnudo (que no es una técnica recomendada, pero puede funcionar con este enganche posterior a la actualización ), puede completar ese enlace, sabiendo que:

 git symbolic-ref HEAD # or git rev-parse HEAD 

Darle el nombre de la twig actual, mientras que $ref representa la twig que se está presionando.
Luego puede actualizar tres treees de trabajo diferentes, cada uno ya configurado en la twig derecha.

Tal vez me falta algo, pero si esto está en un gancho post-update entonces obtienes los nombres de los refs que se están actualizando como parameters para el gancho. por ejemplo, si mi push actualiza master y experimental en un repository, entonces la post-update se invoca con:

  post-update refs/heads/master refs/heads/experimental 

… y puede acceder a ellos con $1 como $2 habitualmente en su script de gancho.

Por cierto, la documentation de githooks señala que quizás desee considerar usar el gancho post-receive , que en cambio obtiene información sobre la input estándar; sin embargo, también le proporciona los valores antiguos y nuevos de la reference, así como el nombre de la reference, que podría ser útil.