web-dev-qa-db-fra.com

Exécuter des hooks Git sous Windows

Je ne parviens pas à exécuter les hooks Git sous Windows. J'ai un référentiel nu et dans son dossier "hooks", les éléments suivants sont placés dans les fichiers "update" et "pre-Push", mais le script PHP ne s'exécute jamais:

"c:/Programs/PHP/php.exe" c:/Data/Scripts/git-pre-Push.phpcli %1

Des idées sur la raison pour laquelle le script PHP n'est pas exécuté?

Dans la fenêtre de la console Git, les éléments suivants apparaissent lorsque j'essaie d'envoyer quelque chose au référentiel nu:

POST git-receive-pack (437 bytes)
remote: error: hook declined to update refs/heads/master
To https://myuser@mydomain/samplerepo
! [remote rejected] master -> master (hook declined)
error: failed to Push some refs to 'https://myuser@mydomain/samplerepo'

... donc je sais que la "mise à jour" est en cours d'exécution. Lorsque je supprime ce fichier, le Push fonctionne parfaitement.

12
TheStoryCoder

Par défaut, Git pour Windows exécute des scripts de raccordement en utilisant son propre port Windows du shell bash. Certes, Unix Shell n'a aucune idée de %1. Soi-disant, Git pour Windows a des hacks supplémentaires en place pour détecter les extensions de nom de fichier «communes» - telles que .bat - et emprunter un autre chemin dans ce cas.

Je pense que votre solution à votre propre programme est la meilleure, mais une autre approche consisterait à réécrire votre script pour le lire.

#!/bin/sh
c:/Programs/PHP/php.exe c:/Data/Scripts/git-pre-Push.phpcli "$@"

(La ligne Shebang n’a pas de sens particulier sous Windows si ce n’est qu’il laisse entendre à la personne suivante d’éditer le script sur la signification de son contenu).

14
kostix
#!/bin/sh
echo "executing pre-commit"

# Instructions:

# Put this file into your .git/hooks folder and set as executable 

 #- for Windows (attrib +x pre-commit)
 #- for ubuntu (chmod +x pre-commit)

# If you want to skip the hook just add the --no-verify: git commit --no-verify

# ---------------------------------------------

# Modify this
# LIST='list\|of\|words\|splitted\|by\|slash\|and\|pipe'
LIST="puts\|debugger;\|binding.pry\|alert(\|console.log("

if git rev-parse --verify HEAD >/dev/null 2>&1; then
    against=HEAD
else
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

for FILE in `git diff-index --name-status --cached $against -- | cut -c3-` ; do
    # Check if the file contains one of the words in LIST
    if grep -w $LIST $FILE; then
      echo $FILE." has unwanted Word. Please remove it. If you want to skip that then run git commit -m '"your comment"' --no-verify"
      exit 1
    fi
      done
exit
0
Rohit Jangid