Post Commit Hook Not Running

42.6k views Asked by At

My post commit hook is not running after git. I have verified that the hook does work if I just run it from the terminal. The code in the hook is:

#!/bin/sh
#.git/hooks/post-commit
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".

perl -pi -e 's/([a-f0-9]+)$/'$( git rev-parse HEAD )/ ../../config/commit.git

I did rename the file to post-commit in ./.git/hooks/ and the permissions are -rwxr-x-r-x so I am not sure why it doesn't work.

4

There are 4 answers

2
Peter Farmer On BEST ANSWER

Try putting some echo lines before and after the perl line like this:

echo "post-commit started"
perl ...........
echo "post-commit finished"

This way you can confirm if the script is actually running, because when you run

git commit

you should see

post-commit started
post-commit finished

Towards the end of your output.

2
Bryce Johnson On

My post-commit script wasn't being called because:

I had named the script post-commit.sh, rather than just post-commit.

To enable a hook script, put a file in the hooks subdirectory of your .git directory that is named appropriately (without any extension) and is executable. From that point forward, it should be called. We’ll cover most of the major hook filenames here. See git-scm

Not sure why I had in my head that hooks needed the bash file extension.

I also didn't realize hook scripts cannot have file extensions. For example,

If you want to use the bundled hook scripts, you’ll have to rename them; their file names all end with .sample

Hope this helps someone.

2
Steven Lu On

I'll leave this here as an answer because I stumbled upon my own answer for when my post-commit hook wasn't running:

chmod +x .git/hooks/post-commit

Probably applies to any kind of hook. In fact, probably applies to any kind of script.

0
n00b On

In addition to the answers noted here, note that if you are expecting user input in your hook, you need to redirect standard input to the keyboard like so (at least for a bash script);

exec < /dev/tty