'git pull' command work from terminal but not with php shell_exec() via git repository hook
The problem is the hook file which i have created is in the /var/www/site/web/hookfile.php (the post request is going there. i am getting the body response also)
and my repo files are in /var/www/git-repo/
its not updating the git-repo when i push anything to my github repository.
I run this command using terminal and its working.
cd /var/www/git-repo && git pull
But through my php file its not working
shell_exec('cd /var/www/git-repo && git pull')
2 Solutions collect form web for “'git pull' command work from terminal but not with php shell_exec() via git repository hook”
shell_exec() fail silently because only report STDOUT and not STDERR.
echo shell_exec("cd /var/www/git-repo && /full/path/to/bin/git pull 2>&1");
Normally is a permission error, and could be fixed adding permission to the user that execute php (apache?)
chown -R www-agent:www-agent repository/
But could be also a connection error to the remote repository (authentication, ssh-keys, …).
I first of all in your php file run a test against your server instance to get any error messages output on screen because exec() family of functions simply fail silently and only report STDOUT and not STDERR:
echo shell_exec("cd /website/root/htdocs && git checkout . && git status 2>&1");
in my case this threw an error that it could not find git command due to lack of binary path defined for apache user. Therefore, a full path needs to be provided to git’s binary. It can be obtained by finding it manually or running in shell:
it returned (further called YOU_FULL_GIT_BINARY_PATH_HERE):
A full path with git command e.g. ‘/usr/local/git/bin/git status’ now runs git commands nicely.
Another thing is to ensure your web server’s user have enough permissions to read/write to your repo folder/files. I have set mine to be owned by apache user (Centos 6.8 other releases might be www:www or www-data:www-data etc.):
chown -R apache:apache YOUR_WEB_OR_REPO_FODLER
In order to ensure any newly added files inherit correct permissions run:
chmod -R g+s YOUR_WEB_OR_REPO_FODLER
The above should get your script to run commands now. Though it doesn’t overcome git password prompt to use ‘git pull’ command for a git user set in YOUR_WEB_OR_REPO_FODLER/.git/config file. Running below command inside repo:
git config credential.helper store
command will prompt for password and let you store it locally. Please note your stored password will be unencrypted and protected only by file system e.g. in /root/.git-credentials. This will allow to run ‘git pull’ without prompting for password.
It’s not ideal for my fully automated continuous integration environment deploying test VPS on demand as it requires to manually enter git user (defined in repo’s .git/config git) password at least once.
Since my environment should always run on code from remote’s origin/master copy I am also running
/YOU_FULL_GIT_BINARY_PATH_HERE/git checkout .
before invoking ‘git pull’ to ensure any local changes are lost forever alternatively do a hard reset instead using:
/YOU_FULL_GIT_BINARY_PATH_HERE/git fetch origin /YOU_FULL_GIT_BINARY_PATH_HERE/git reset --hard origin/master