2009-06-18 8 views

Respuesta

26

Si uno de estos ganchos no lo hará i se sorprenderá

http://schacon.github.com/git/githooks.html

Tal vez éste:

post-pago y envío

Este gancho se invoca cuando un git-checkout se ejecuta después de tener actualizado el árbol de trabajo. El gancho se dado tres parámetros: la ref de la CABEZA anterior, el árbitro de la nueva cabeza de (que puede o no puede haber cambiado), y una bandera que indica si el salida fue un checkout rama (ramas cambiantes , flag = 1) o un archivo pago (recuperando un archivo del índice , flag = 0). Este gancho no puede afectar el resultado de git-checkout.

23

Un gancho Git es un guión colocado en un lugar especial de su repositorio, que la ubicación es:

.git/ganchos

La secuencia de comandos pueden ser de cualquier tipo que pueda ejecute en su entorno, es decir, bash, python, ruby, etc.

El gancho que se ejecuta después de finalizar la compra es post-checkout. A partir de los documentos:

... El gancho se da tres parámetros ...

Ejemplo:

  1. Crear el gancho (script):

    touch .git/hooks/post-checkout 
    chmod u+x .git/hooks/post-checkout 
    
  2. Hook contenido de la muestra:

#!/bin/bash                  

set -e                   

printf '\npost-checkout hook\n\n'             

prevHEAD=$1                  
newHEAD=$2                  
checkoutType=$3                 

[[ $checkoutType == 1 ]] && checkoutType='branch' ||        
          checkoutType='file' ;         

echo 'Checkout type: '$checkoutType            
echo ' prev HEAD: '`git name-rev --name-only $prevHEAD`      
echo '  new HEAD: '`git name-rev --name-only $newHEAD` 

Nota: El tinglado en la primera línea indica el tipo de secuencia de comandos.

Este script (git hook) solo capturará los tres parámetros aprobados y los imprimirá en un formato amigable para los humanos.

+0

¿Conoces alguna forma de saber si esto es el checkout de creación de la rama (además de mirar el nuevo reflog de HEAD)? – pkoch

+0

Parece que sería una buena idea que haga una pregunta completamente nueva. Si lo hace, envíeme el enlace y veré si puedo ayudarlo. ¿Cuál es el problema que estás tratando de resolver? – givanse

+0

Si un commit es la parte superior de varias ramas, 'name-rev' solo da el nombre que viene primero alfabéticamente. Por lo tanto, después de verificar una rama con un nombre que precede alfabéticamente al nombre de la rama original, la línea 'prev HEAD' dará el nombre de la nueva rama. Una solución alternativa: 'thisBranchName = $ (git rev-parse --abbrev-ref HEAD); para la rama en $ (rama git --color = nunca --contiene $ 1 | sed-e 's /^..//'); do if ["$ (git show-ref -s $ branch)" == $ 1] && ["$ branch"! = "$ thisBranchName"]; luego parentBranchName = $ branch; break; fi; done' – Ansa211

1

El post-checkouthook recibe tres parámetros:

  1. Ref de la cabeza anterior
  2. Ref del nuevo jefe
  3. Si esto es una protección de archivo (0) o checkout de un branch (1)

Puede utilizar el hecho de que una rama creada a partir de la CABEZA actual tendrá el mismo valor para los parámetros 1 y 2.

cat > .git/hooks/post-checkout <<"EOF" 
if [ "$3" == "0" ]; then exit; fi 
if [ "$1" == "$2" ]; then 
    echo "New branch created. (Probably)." 
fi 
EOF 

chmod u+x .git/hooks/post-checkout 

Limitaciones:

  • Comprobación de una rama existente, que pasa a ser en la misma cabeza como la cabeza actual engañar a ella. No se detectará
  • Creación de una nueva rama no desde HEAD.
4

Similar a otros, pero verifica que la rama se ha extraído una vez.

#!/bin/bash 

# this is a file checkout – do nothing 
if [ "$3" == "0" ]; then exit; fi 

BRANCH_NAME=$(git symbolic-ref --short -q HEAD) 
NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l` 

#if the refs of the previous and new heads are the same 
#AND the number of checkouts equals one, a new branch has been created 
if [ "$1" == "$2" ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then 
    git push origin ${BRANCH_NAME} 
fi 
+1

Esto me puso en el camino correcto, ¡muchas gracias! Ya que está grepping reflog para contar las cajas Creo que uno de gotcha sería si una rama había existido previamente y una nueva rama con el mismo nombre fue creado, esa rama no serían reconocidos como nueva. Ese podría ser el comportamiento deseado o un problema según el caso de uso, pero pensé que lo mencionaría. – Pwnrar

Cuestiones relacionadas