Gancho precompromiso de Git: files modificados / agregados

Estoy escribiendo un gancho de precompromiso. Quiero ejecutar php -l contra todos los files con extensión .php. Sin embargo, estoy atascado.

Necesito get una list de files nuevos / modificados que están en etapas. los files eliminados deben ser excluidos

He intentado usar git diff y git ls-files , pero creo que necesito ayuda.

git diff --cached --name-status mostrará un resumen de lo que está organizado, para que pueda excluir fácilmente los files eliminados, por ejemplo:

 M wt-status.c D wt-status.h 

Esto indica que wt-status.c se modificó y wt-status.h se eliminó en el área de ensayo (índice). Por lo tanto, para verificar solo los files que no fueron eliminados:

 steve@arise:~/src/git <master>$ git diff --cached --name-status | awk '$1 != "D" { print $2 }' wt-status.c wt-status.h 

Tendrás que pasar por aros adicionales para manejar los nombres de files con espacios en though (opción -z para git diff y algunos análisis más interesantes)

Una forma un poco más orderada de get la misma list es:

 git diff --cached --name-only --diff-filter=ACM 

Esto devolverá la list de files que deben verificarse.

Pero ejecutar php -l en su copy de trabajo puede no ser lo correcto. Si está realizando una confirmación parcial, es decir, simplemente seleccionando un subset de las diferencias entre su set de trabajo actual y el HEAD para la confirmación, entonces la testing se ejecutará en su set de trabajo, pero certificará una confirmación que nunca ha existido en su disco.

Para hacerlo bien, debes extraer toda la image por etapas a un área de temperatura y realizar la testing allí.

 rm -rf $TEMPDIR mkdir -p $TEMPDIR git checkout-index --prefix=$TEMPDIR/ -af git diff --cached --name-only --diff-filter=ACM | xargs -n 1 -I '{}' \bin\echo TEMPDIR/'{}' | grep \\.php | xargs -n 1 php -l 

Consulte Crear un gancho precompromiso mejor para Git para otra implementación.

Esto es lo que uso para mis cheques Perl:

 git diff --cached --name-status | while read st file; do # skip deleted files if [ "$st" == 'D' ]; then continue; fi # do a check only on the perl files if [[ "$file" =~ "(.pm|.pl)$" ]] && ! perl -c "$file"; then echo "Perl syntax check failed for file: $file" exit 1 fi done 

para PHP se verá así:

 git diff --cached --name-status | while read st file; do # skip deleted files if [ "$st" == 'D' ]; then continue; fi # do a check only on the php files if [[ "$file" =~ ".php$" ]] && ! php -l "$file"; then echo "PHP syntax check failed for file: $file" exit 1 fi done 

Ninguna de las respuestas aquí admite nombres de files con espacios. La mejor forma de hacerlo es agregar el indicador -z en combinación con xargs -0

 git diff --cached --name-only --diff-filter=ACM -z | xargs -0 ... 

Esto es lo que da git en las muestras incorporadas (vea .git / hooks / pre-commit.sample )

git diff –cached no es suficiente si la llamada de confirmación se especificó con la bandera -a, y no hay manera de determinar si esa bandera se ha lanzado al gancho. Ayudaría si los arguments para comprometer deberían estar disponibles para el gancho para su examen.