'git pull'命令从终端工作但不是通过git repository hook使用php shell_exec()

Har*_*mar 12 php git github repository shell-exec

我在我的github存储库中创建了一个webhook,它在我的实时服务器上的hook url上发布,用于运行pull命令来更新服务器上的repo文件.

问题是我创建的钩子文件位于/var/www/site/web/hookfile.php(帖子请求就在那里.我也得到了身体响应)

我的repo文件在/ var/www/git-repo /

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

cd /var/www/git-repo && git pull
Run Code Online (Sandbox Code Playgroud)

但通过我的PHP文件它无法正常工作

shell_exec('cd /var/www/git-repo && git pull')
Run Code Online (Sandbox Code Playgroud)

Dar*_*rio 11

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

试试:

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

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

chown -R www-agent:www-agent repository/
Run Code Online (Sandbox Code Playgroud)

但也可能是远程存储库的连接错误(身份验证,ssh-keys,...).

  • 收到此错误:无法打开 .git/FETCH_HEAD:权限被拒绝 (2认同)

web*_*.eu 5

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

echo shell_exec("cd /website/root/htdocs && git checkout . && git status 2>&1");
Run Code Online (Sandbox Code Playgroud)

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

'which git'
Run Code Online (Sandbox Code Playgroud)

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

/usr/local/git/bin/git
Run Code Online (Sandbox Code Playgroud)

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

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

chown -R apache:apache YOUR_WEB_OR_REPO_FODLER
Run Code Online (Sandbox Code Playgroud)

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

chmod -R g+s YOUR_WEB_OR_REPO_FODLER
Run Code Online (Sandbox Code Playgroud)

以上应该让你的脚本现在运行命令。尽管对于在 YOUR_WEB_OR_REPO_FODLER/.git/config 文件中设置的 git 用户使用“git pull”命令并不能克服 git 密码提示。在 repo 中运行以下命令:

git config credential.helper store
Run Code Online (Sandbox Code Playgroud)

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

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

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

/YOU_FULL_GIT_BINARY_PATH_HERE/git checkout .
Run Code Online (Sandbox Code Playgroud)

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

/YOU_FULL_GIT_BINARY_PATH_HERE/git fetch origin
/YOU_FULL_GIT_BINARY_PATH_HERE/git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)