目前我正在用 php 将文件写到一个目录中,我添加该目录(工作正常),然后当我尝试执行 svn commit 时,它不起作用也不返回任何类型的错误代码。有人对此有任何想法吗?
$tmp = exec('cd '.$this->build_locations[$this->type].'; svn commit --username user --password pw; ls', $output);
Run Code Online (Sandbox Code Playgroud)
我执行 cd 到目录(这里的 ls 工作正常吗),之后我执行 ls 来确认它仍然在目录中。
我也尝试过:
svn help
Run Code Online (Sandbox Code Playgroud)
它会很好地返回所有命令(所以我知道这不是找不到 svn 命令的问题。
我已经对文件 777 进行了 chmod 操作以确认它可以执行。
编辑后的代码:
$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;
Run Code Online (Sandbox Code Playgroud)
这会产生:
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'
Run Code Online (Sandbox Code Playgroud)
SVN 命令行错误会转到 stderr,而不是 stdout,这就是您看不到它们的原因。您想要做的是将 stderr 重定向到 stdout,然后print_r($output)确定错误的原因。
exec('svn commit <stuff> 2>&1', $output, $returnStatus);
if ( $returnStatus )
{
print_r($output);
}
Run Code Online (Sandbox Code Playgroud)
示例输出:
Array
(
[0] => svn: Commit failed (details follow):
[1] => svn: '/path/to/<stuff>' is not under version control
)
Run Code Online (Sandbox Code Playgroud)
这并不理想,因为它在不必要的情况下将 stderr 与 stdout 混合在一起,但我不知道在这种情况下获得所需输出的另一种方法。如果其他人这样做,请发表评论。
注意:exec(...) 的第三个参数是返回状态,而不是错误消息,因此您也需要相应地调整代码。
如果修改后的错误输出2>&1无法帮助解决问题的根本原因,请在此处发布新的输出。
新信息后编辑:
您是否将此 SVN 工作副本从其他地方上传到您的服务器?这可以解释这个错误。
如果我从本地存储库中签出工作副本,将其上传到远程服务器,然后尝试提交,我会收到相同的错误。
如果是这种情况,您需要在运行 PHP 脚本的服务器上执行工作副本的“svn checkout”,以便能够提交它。如果该服务器无法与存储库的服务器通信,那么那就是另一个问题了。
| 归档时间: |
|
| 查看次数: |
5446 次 |
| 最近记录: |