'git pull' 命令从终端工作,但不能通过 git 存储库钩子使用 php shell_exec()

2022-08-31 00:51:39

我已经在我的github存储库中创建了一个webhook,它发布在我的实时服务器上的钩子URL上,以运行拉取命令以更新服务器上的存储库文件。

问题是我创建的钩子文件在/var/www/site/web/hookfile中.php(post请求在那里。我也得到了正文响应)

我的存储库文件位于 /var/www/git-repo/ 中

当我将任何东西推送到我的github存储库时,它不会更新git-repo。我使用终端及其工作运行此命令。

cd /var/www/git-repo && git pull

但是通过我的php文件它不起作用

shell_exec('cd /var/www/git-repo && git pull')

答案 1

shell_exec() 以静默方式失败,因为仅报告 STDOUT 而不报告 STDERR。

尝试使用:

echo shell_exec("cd /var/www/git-repo && /full/path/to/bin/git pull 2>&1");

通常是权限错误,可以修复向执行php的用户添加权限(apache?

chown -R www-agent:www-agent repository/

但也可能是与远程存储库的连接错误(身份验证,ssh密钥等)。


答案 2

首先,在您的php文件中,对服务器实例运行测试,以获取屏幕上输出的任何错误消息,因为exec()系列函数只是静默失败并且仅报告STDOUT而不是STDERR:

echo shell_exec("cd /website/root/htdocs && git checkout . && git status 2>&1");

在我的情况下,这抛出了一个错误,即由于缺乏为apache用户定义的二进制路径,它找不到git命令。因此,需要为 git 的二进制文件提供完整路径。它可以通过手动查找或在shell中运行来获得:

'which git'

它返回(进一步称为YOU_FULL_GIT_BINARY_PATH_HERE):

/usr/local/git/bin/git

带有 git 命令的完整路径,例如 '/usr/local/git/bin/git status' 现在可以很好地运行 git 命令。

另一件事是确保您的Web服务器用户有足够的权限来读取/写入您的存储库文件夹/文件。我已经将我的设置为由apache用户拥有(Centos 6.8;其他版本可能是www:www或www-data:www-data等):

chown -R apache:apache YOUR_WEB_OR_REPO_FOLDER

为了确保任何新添加的文件继承正确的权限,请运行:

chmod -R g+s YOUR_WEB_OR_REPO_FOLDER

以上应该让你的脚本现在运行命令。虽然它没有克服git密码提示,但对YOUR_WEB_OR_REPO_FOLDER/.git/config文件中设置的git用户使用“git pull”命令。在存储库中运行以下命令:

git config credential.helper store

命令将提示输入密码,并允许您将其存储在本地。请注意,您存储的密码将未加密,仅受文件系统保护,例如在 /root/.git-credentials 中。这将允许在不提示输入密码的情况下运行“git pull”。

对于我的全自动持续集成环境按需部署测试VPS来说,这并不理想,因为它需要手动输入git用户(在repo的.git/config git中定义)密码至少一次。

由于我的环境应始终在远程源/主副本的代码上运行,因此我也在运行

/YOU_FULL_GIT_BINARY_PATH_HERE/git checkout .

在调用“git pull”以确保任何本地更改永远丢失之前,或者使用以下方法进行硬重置:

/YOU_FULL_GIT_BINARY_PATH_HERE/git fetch origin
/YOU_FULL_GIT_BINARY_PATH_HERE/git reset --hard origin/master

推荐