103 votes

Pourquoi mon crochet de pré-engagement Git n'est-il pas exécutable par défaut ?

Si vous consultez la réponse acceptée dans : Aggrégation et minification de JavaScript dans un crochet précommit Git, vous verrez que j'ai dû faire un chmod +x sur mon crochet précommit pour le faire fonctionner.

Pourquoi cela n'est-il pas exécutable par Git par défaut ?

3voto

ato Points 174

J'avais les mêmes symptômes, mais une cause totalement différente:

En plus de définir les bons bits de permission via chmod +x .git/hooks/pre-commit, assurez-vous que votre système de fichiers est monté de manière à permettre ces changements. Cela peut par exemple poser problème lorsque vous avez un système dual boot et que vous travaillez sur un lecteur Windows monté avec ntfs-3g sous Linux.

Vous pouvez corriger cela en modifiant les permissions par défaut dans /etc/fstab ou l'équivalent systemd.

2voto

venky royal Points 11

J'ai résolu ce problème en exécutant la commande ci-dessous

chmod ug+x .husky/*

2voto

J'ai rencontré le même problème lorsque j'ai créé "pre-commit" manuellement. L'approche avec chmod pourrait fonctionner, mais c'est une solution de contournement et le problème pourrait apparaître sur une autre machine.

Je l'ai résolu en recréant correctement "pre-commit" avec la commande suivante:

npx husky add .husky/pre-commit "npm run lint"

1voto

Jakub Wagner Points 122

Tout comme une réponse additionnelle, voici la fonction que vous pouvez utiliser pour initialiser un dépôt Git, qui rend automatiquement les crochets exécutables ; vous devriez le mettre dans .bashrc ou un fichier que vous sourcez lorsque vous démarrez votre terminal. L'histoire est ci-dessous :)

ginit () {
    git init
    gitpath=`git rev-parse --show-superproject-working-tree --show-toplevel | head -1`
    chmod u+x "$gitpath"/.git/hooks/*
    for submodule in "$gitpath"/.git/modules/*; do
        chmod u+x "$submodule"/hooks/*
    done
}

J'étais ennuyé par la même chose que vous. Je ne veux pas me souvenir que je dois rendre tous les crochets exécutables chaque fois que j'initialise un dépôt. De plus, lorsque vous utilisez les sous-modules, leurs crochets ne sont pas dans .git/hooks, mais dans .git/modules/NomDuSousModule/hooks, et ceux-ci devraient également être rendus exécutables.

0voto

Julien Carsique Points 1023

Le fichier de crochet de modèle original doit être exécutable.

Dans mon cas, c'était un crochet personnalisé qui manquait du bit exécutable :

$ git config init.templateDir
~/.git_template
$ stat -c "%A" ~/.git_template/hooks/pre-commit 
-rw-r--r--
$ chmod u+x ~/.git_template/hooks/pre-commit

Maintenant, le crochet pre-commit créé sur git init ou git clone est correctement défini comme exécutable :

$ git init hook-exec
$ stat -c "%A" hook-exec/.git/hooks/pre-commit 
-rwxrwxr-x

Voir https://git-scm.com/docs/git-init#_template_directory

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