PHP:exec(svn commit)不返回任何错误也不工作

Pet*_*gad 2 php svn exec

目前我正在用 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)

Mic*_*ssa 5

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”,以便能够提交它。如果该服务器无法与存储库的服务器通信,那么那就是另一个问题了。