目前,我正在用php将文件写到目录中,我将该目录添加(工作正常),然后当我尝试执行svn时,提交它不起作用,也不返回任何错误代码.有人对此有任何想法吗?
$tmp = exec('cd '.$this->build_locations[$this->type].'; svn commit --username user --password pw; ls', $output);
我将cd转到目录(在此执行ls工作正常),然后再执行ls确认其仍在目录中.
我也尝试过:
svn help
这使我所有的命令都很好(所以我知道找不到svn命令不是问题.
我已将文件777更改为可以执行的文件.
编辑代码:
$output = array();
$tmp1 = exec("cd ".$this->build_locations[$this->type].";");
$tmp = exec("svn commit ".$this->build_locations[$this->type].$this->app_id." --username user --password password -m 'test' --non-interactive --trust-server-cert --quiet 2>&1;", $output, $error);
if($error){
echo('
');
print_r($output);
echo('
');}
exit;
这将产生:
Array
[0] => could not lookup DNS configuration info service: (ipc/send) invalid destination port
[1] => svn: Commit failed (details follow):
[2] => svn: Unknown hostname 'my.host'
解决方法:
SVN命令行错误出现在stderr而不是stdout上,这就是为什么您看不到它们的原因.您要执行的操作是将stderr重定向到stdout,然后将print_r($output)重定向以确定错误原因.
exec('svn commit 2>&1', $output, $returnStatus);
if ( $returnStatus )
{
print_r($output);
}
样本输出:
Array
(
[0] => svn: Commit failed (details follow):
[1] => svn: '/path/to/' is not under version control
)
这是不理想的,因为在本来没有必要的情况下,它将stderr与stdout混合在一起,但是在这种情况下,我不知道另一种获得所需输出的方法.如果有人这样做,请发表评论.
注意:exec(…)的第三个参数是返回状态,而不是错误消息,因此您也需要相应地调整代码.
如果进行2& 1修改后的错误输出不能帮助解决问题的根本原因,请在此处发布新的输出.
编辑新信息后:
您是否将此SVN工作副本从其他地方上传到您的服务器?那可以解释这个错误.
如果我从本地存储库中签出工作副本,将其上传到远程服务器,然后尝试提交,则会遇到相同的错误.
在这种情况下,您需要在运行PHP脚本的服务器上执行工作副本的“ svn签出”,以便能够对其进行提交.如果该服务器无法与存储库的服务器通信,那将是另一个问题.
标签:php,svn,exec
来源: https://codeday.me/bug/20191012/1900072.html