92 votes

Git pre-commit hook : fichiers modifiés/ajoutés

J'écris un crochet de pré-commission. Je veux exécuter php -l contre tous les fichiers avec l'extension .php. Mais je suis coincé.

Je dois obtenir une liste des fichiers nouveaux/modifiés qui sont mis en scène. fichiers supprimés doivent être exclus.

J'ai essayé d'utiliser git diff git ls-files, mais je pense que j'ai besoin d'un coup de main ici.

57voto

araqnid Points 33350

git diff --cached --name-status affichera un résumé de ce qui est mis en scène, de sorte que vous pouvez facilement exclure les fichiers supprimés, par exemple :

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

Ceci indique que wt-status.c a été modifié et wt-status.h a été enlevé dans la zone de transit (indice). Donc, pour vérifier uniquement les fichiers qui n'ont pas été supprimés :

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

Vous devrez sauter à travers des cerceaux supplémentaires pour traiter les noms de fichiers avec des espaces dans (-z option de git diff et quelques analyses plus intéressantes)

26voto

eddygeek Points 50

Aucune des réponses ici ne supporte les noms de fichiers avec des espaces. La meilleure façon pour cela est d'ajouter le drapeau -z en combinaison avec xargs -0

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

C'est ce qui est donné par git dans les échantillons intégrés (voir .git/hooks/pre-commit.sample)

17voto

Voici ce que j'utilise pour mes contrôles Perl :

#!/bin/bash

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 < <(git diff --cached --name-status)

pour PHP, il ressemblera à ceci :

#!/bin/bash

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 < <(git diff --cached --name-status)

0voto

mpersico Points 34

git diff --cached n'est pas suffisant si l'appel de validation a été spécifié avec le drapeau -a, et il n'y a aucun moyen de déterminer si ce drapeau a été lancé dans le crochet. Il serait utile que les arguments à engager soient à la disposition du crochet pour examen.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X