It's very weird but when setting a git repository and creating a post-receive hook with:

echo "--initializing hook--"
cd ~/websites/testing
echo "--prepare update--"
git pull
echo "--update completed--"

the hook runs indeed, but it never manage to run git pull properly:

6bfa32c..71c3d2a  master -> master
--initializing hook--
--prepare update--
fatal: Not a git repository: '.'
Failed to find a valid git directory.
--update completed--

so I'm asking myself now, how it's possible to make the hook update the clone with post-receive?

in this case the user running the processes is the same, and its everything inside the user folder so I really don't understand...because if if I go manually into

cd ~/websites/testing
git pull

it works without any problem...

any help on that would be pretty much appreciated

Thanks a lot

6 Answers 6


While the hook is running, GIT_DIR and (if the worktree was defined explicitly) GIT_WORK_TREE are set. That means your pull won't run with the second repository in the directory you changed to.

Try git --git-dir ~/websites/testing/.git --work-tree ~/websites/testing pull; or unset git's repo-local environment with this:

unset $(git rev-parse --local-env-vars)

More info on these environment variables in man 1 git.

  • 1
    Thanks a lot for that Tobu, it really works, I will check out more information about it too. Cheers
    – zanona
    Jan 29, 2010 at 22:32

One thing I experienced was that using the post-update hook '--git-dir' worked great but git was still complaining about a missing working tree (despite using '--work-tree')

In short, this did not work:

git --git-dir /path/to/websites/testing/.git --work-tree /path/to/websites/testing pull

whereas this worked:

cd /path/to/websites/testing
git --git-dir /path/to/websites/testing/.git pull


Doesn't this work?

cd /home/smb/websites/testing
env -i git pull


Better still

cd /home/smb/websites/testing
unset GIT_DIR
git pull

Have you tried with the full path instead of the ~?

cd /home/smb/websites/testing
git pull

The script is probably invoked with /bin/sh, which doesn't understand ~. Try it with the full path to ~ instead.


The first recommended answer is right - when a hook is running GIT_DIR etc are set. However, if you want to be able to use the script in another repository then that method is flawed because it hard-codes resetting the GIT_DIR. As they implied, the other way is to remove the variable by using env as follows: env -i git reset --hard Obviously what command you run there is up to you - it's just the 'env -i' bit that's the important bit.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .