目前我正在用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('<pre>');
print_r($output);
echo('</pre>');
}
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'
答案 0 :(得分:4)
SVN命令行错误转到stderr,而不是stdout,这就是你无法看到它们的原因。你想要做的是将stderr重定向到stdout然后print_r($output)
以确定错误的原因。
exec('svn commit <stuff> 2>&1', $output, $returnStatus);
if ( $returnStatus )
{
print_r($output);
}
示例输出:
Array
(
[0] => svn: Commit failed (details follow):
[1] => svn: '/path/to/<stuff>' is not under version control
)
这不是理想的,因为它会将stderr和stdout混合在一起,否则就不需要了,但我不知道在这种情况下获得所需输出的另一种方法。如果其他人这样做,请发表评论。
注意: exec(...)的第三个参数是返回状态,而不是错误消息,因此您需要相应地调整代码
如果在进行2>&1
修改后输出错误无法解决问题的根本原因,请在此处发布新输出。
在新信息后进行修改:
您是否已将此SVN工作副本从其他位置上传到您的服务器?这可以解释这个错误。
如果我从本地存储库中检出工作副本,将其上传到我的远程服务器,然后尝试提交,我会收到同样的错误。
如果是这种情况,您需要在运行PHP脚本的服务器上执行工作副本的“svn checkout”,以便能够提交它。如果该服务器无法与存储库的服务器通信,那么这是另一个问题。
答案 1 :(得分:1)
你能否尝试抛弃错误(阅读Mike的评论)状态。
('cd '.$this->build_locations[$this->type].'; svn commit --username user --password pw; ls', $output, $error);
if($error){
print_r($error);
}
我建议将上述内容分解为3个单独的命令以进行调试。
此外,如果用户可以操纵$ this-type,那么您的代码就容易受到影响,因为它们可以传递类似:.; cat /etc/passwd
的内容,这将成为
$tmp = exec('cd .; cat /etc/passwd; svn commit --username user --password pw; ls', $output);
答案 2 :(得分:0)
AFAIK,在svn commit
之后,如果未提供-m
选项,则打开编辑器以输入提交消息。尝试传递-m "Some commit message"
,也许这会有所帮助。