首先,在您的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