ver tipos tag pendientes modificados log etiquetas crear commits archivos git hook pre-commit-hook pre-commit

tipos - git ver commits pendientes



Gancho precompromiso de Git: archivos modificados/agregados (5)

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

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

Necesito obtener una lista de archivos nuevos / modificados que están en etapas. los archivos eliminados deben ser excluidos

He intentado usar git diff y git ls-files , pero creo que necesito una mano aquí.


Ninguna de las respuestas aquí admite nombres de archivos 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 )


Una forma un poco más ordenada de obtener la misma lista es:

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

Esto devolverá la lista de archivos que deben verificarse.

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

Para hacerlo bien, debes extraer toda la imagen por etapas a un área de temperatura y realizar la prueba 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.


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 argumentos para comprometer deberían estar disponibles para el gancho para su examen.


git diff --cached --name-status mostrará un resumen de lo que está organizado, para que pueda excluir fácilmente los archivos 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 archivos 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 archivos con espacios en though (opción -z para git diff y algunos análisis más interesantes)