我修改了这个github项目的一个版本https://github.com/lkwdwrd/git-deploy [我修改了它,因为JSON没有在我的服务器上解析(Mediatemple Grid Server)&我还添加了自定义日志记录]该脚本使用git hooks自动部署github repos。
脚本工作正常一段时间但最近停止了工作。
我已将问题隔离到git fetch
命令。这是我正在使用的确切代码:
exec( 'git fetch ' . $this->_remote . ' ' . $this->_branch, $fetch_output, $fetch_return_var );
$fetch_output
数组为空,$fetch_return_var
为255.所以我认为255实际上意味着-1,这是git命令的错误。
但是,当SSH进入服务器并作为同一个用户运行时,我能够成功执行此命令,其中的字符串与正在构建的exec()函数的第一个参数完全相同。
所以现在我迷路了。
提前致谢
更新:
感谢@Matthias Huttar我将exec()
更改为proc_open()
调用,让我看到了STDERR的输出[不确定为什么它没有通过exec()
进行记录,但我认为这是因为它是git fetch
]的子流程。输出结果如下:
error: cannot fork() for git-remote-https: Resource temporarily unavailable
所以我认为我的服务器环境存在问题。但是我还是不确定。
答案 0 :(得分:2)
如果git fetch中存在错误,则输出很可能不会写入stdout而是写入stderr。 exec只会给你输出stdout并忽略stderr。
exec( 'git fetch ' . $this->_remote . ' ' . $this->_branch.' 2>&1', $fetch_output, $fetch_return_var );
很可能会显示您的错误。我怀疑你从php调用的git进程是以不同的用户身份运行的(例如你是apache服务器的用户),因此你可以访问ssh密钥(或用户名/密码)。如果是这种情况,您的错误消息将是“权限被拒绝”。解决方案是为该用户生成一个新的默认ssh密钥,并在github中授予此密钥访问权限(“部署密钥”是github如何调用它)