I'm having trouble executing Git hooks on Windows. I have a bare repo and in it's "hooks" folder I put the following into both the "update" and "pre-push" files but the PHP script is never being executed:
"c:/Programs/PHP/php.exe" c:/Data/Scripts/git-pre-push.phpcli %1
Any ideas as to why the PHP script isn't executed?
In the Git console window I see the following when I try to push something to the bare repo:
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'
...so I know that the "update" is somehow being executed. When I remove that file the push works just fine.
I believe the secret is in the shebang part - on windows you will need to give the full path to your sh.exe like this:
If you have cygwin installed you can also point to sh.exe or bash.exe located in cygwin/bin You can even utilize other scripting languages supported via cyqwin - e.g. ruby:
By default, Git for Windows executes hook scripts using its own Windows port of the
bash
shell. Certainly, a Unix shell has no idea about%1
. Supposedly, Git for Windows has extra hacks in place to detect "common" filename extensions — such as.bat
— and take an alternate route in such a case.I think your fix to your own program is the best, but another approach would be to rewrite your script to read
(the shebang line has no real special sense under Windows other than hinting the next person to edit the script about the meaning of its content).