Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling 'git pull' from a git post-update hook

I have a central git repo set up using gitolite.

I want to set up a hook such that whenever a user pushes to the repo, it performs a pull elsewhere followed by some automated testing.

So far, I only want to it perform the pull.

In the hooks directory I created the following script names post-update:

#!/bin/sh  
cd /home/git/www/epicac
git pull

When I invoke this script using ./post-update, it does exactly what I want.

However, whenever it's invoked automatically as I hook, I get: fatal: Not a git repository: '.'

Any idea why this might be happening?

like image 890
Kevin Dolan Avatar asked Aug 22 '10 18:08

Kevin Dolan


People also ask

What is post commit hook in Git?

The post-commit hook is called immediately after the commit-msg hook. It can't change the outcome of the git commit operation, so it's used primarily for notification purposes. The script takes no parameters and its exit status does not affect the commit in any way.

How do you attach a Precommit hook?

Open a terminal window by using option + T in GitKraken Client. Once the terminal windows is open, change directory to . git/hooks . Then use the command chmod +x pre-commit to make the pre-commit file executable.

How do I manually run a Git hook?

If you want to manually run all pre-commit hooks on a repository, run pre-commit run --all-files . To run individual hooks use pre-commit run <hook_id> . The first time pre-commit runs on a file it will automatically download, install, and run the hook.

Do Git hooks get pushed?

No. Hooks are per-repository and are never pushed.


2 Answers

You have various diagnostics to run as suggested in this SO answer.

In particular, check out the the value of GIT_DIR and GIT_WORK_TREE.

While the hook is running, GIT_DIR and (if the worktree can't be inferred from GIT_DIR) GIT_WORK_TREE are set.
That means your pull won't run with the repository in the directory you changed to.


See also blog post Using Git Inside a Git Hook:

Eventually we got our linux guru over and he noticed that the environment under which the git user runs is totally different when inside a hook.
Gitolite does a bunch of things to the env, but the one that was screwing us up was the setting of the GIT_DIR.
After we figured that out, the solution was as easy as:

ENV.delete 'GIT_DIR'

in our ruby script that is triggered by the 'post-receive' hook.


Same deal in Git Tip: Auto update working tree via post-receive hook, but with an elegant way out of this:

The solution?
It turns out the post-receive hook starts out with the GIT_DIR environment variable set to the repo/.git folder, so no matter what path you 'cd' into it will always try to run any following git commands there.
Fixing this is simply a matter of unsetting the GIT_DIR
(thanks to Ulrich Petri for the elegant env -i solution):

#!/bin/sh
cd ..
env -i git reset --hard
like image 73
VonC Avatar answered Sep 22 '22 00:09

VonC


How about specifying the --git-dir.

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
like image 25
satomacoto Avatar answered Sep 24 '22 00:09

satomacoto