Git pre-commit hook : modification/ajout de fichiers
Je suis en train d'écrire un pre-commit hook. Je veux courir php -l
à l'encontre de tous les fichiers .extension php. Cependant, je suis coincé.
J'ai besoin d'obtenir une liste de nouveaux/modifiés les fichiers qui sont mis en scène. fichiers supprimés doivent être exclus.
J'ai essayé d'utiliser git diff
et git ls-files
, mais je pense que j'ai besoin d'un coup de main ici.
- phpadvent.org/2008/dont-commit-that-error-by-travis-swicegood
- C'est assez agréable. Il ne gère pas partiellement mise en scène fichiers. Voir mon commentaire de @LarryH de réponse.
Vous devez vous connecter pour publier un commentaire.
git diff --cached --name-status
affiche un résumé de ce qui est mis en scène, de sorte que vous pouvez facilement exclure les fichiers supprimés, par exemple:Cela indique que wt-statut.c a été modifié et wt-statut.h a été enlevé dans la zone de transit (index). Donc, pour vérifier que les fichiers n'étaient pas supprimés:
Vous devez sauter à travers les cerceaux de traiter avec les noms de fichiers avec des espaces bien (option-z pour git diff et un peu plus intéressante analyse syntaxique)
$1 != "R"
devrait lire$1 != "D"
print $2
partie de la commande awk ne fonctionne que si le nom de fichier ne contient pas d'espaces. Une solution possible pour ce:... | awk '$1 != "D" { $1=""; sub(FS,""); print $0 }'
. Une autre remarque: pour fichier renomme, lagit diff
commande imprime des ANCIENS et NOUVEAUX noms. Si seulement le nouveau nom est désiré, ajouter un--no-renames
option pourgit diff
, cela permettra de traiter le renommer comme la suppression de l'ancien fichier et l'ajout d'un nouveau fichier.Un peu plus propre façon d'obtenir la même liste est:
Ce sera le retour de la liste des fichiers qui doivent être vérifiées.
Mais juste en cours d'exécution
php -l
sur votre copie de travail ne peut pas être la bonne chose à faire. Si vous faites une partielle s'engager c'est à dire juste en sélectionnant un sous-ensemble des différences entre votre travail actuel et la TÊTE pour la validation, le test sera exécuté sur votre jeu de travail, mais sera certification d'un commit qui n'a jamais existé sur votre disque.De le faire correctement, vous devez extraire l'ensemble de la mise en scène de l'image à une température de zone et effectuer le test là .
Voir La construction d'une meilleure pre-commit hook Git pour une autre mise en œuvre.
php -l
. Et c'est ce que nous nous sommes retrouvés avec. Voir ici: github.com/phpbb/phpbb3/blob/develop-olympus/git-tools/hooks/...git show :FILENAME | php -l
.Voici ce que j'utilise pour mon Perl vérifie:
pour PHP, il ressemblera à ceci:
Aucune des réponses ici de soutenir les noms de fichiers avec des espaces. Le meilleur moyen pour cela est d'ajouter la
-z
drapeau en combinaison avecxargs -0
C'est ce qui est donné par git dans les échantillons intégrés (voir .git/hooks/pre-commit.exemple de)
git diff --cached n'est pas suffisante si le commit appel a été spécifié avec l'option-a, et il n'y a aucun moyen de déterminer si le drapeau a été lancée dans le crochet. Il serait utile si les arguments de commettre devrait être disponible pour le crochet pour examen.
git status --porcelain | grep -E -v '^[? ]'
git status --porcelain | perl -ane 'print $F[1],qq(\n) if m/^[ACM] /'
est une meilleure réponse. Il a l'avantage d'utiliser un --porcelaine option, garantie de ne jamais changer. Utilisez votre propre analyseur si perl est trop lourd pour vous.