PHP proc_open 无法处理带空格的路径?

PHP proc_open unable to handle path with spaces?

我正在尝试使用 PHING 检出 git 存储库作为构建过程的一部分。 PHING 使用 pear/versioncontrol_git 来处理 git 任务。我通往 git 的路径是 C:\Program Files\Git\bin\git.exe.

两个命令 运行 使用此路径,<gitpath> --version<gitpath> clone -q -repo=...

<gitpath> --version 工作正常。 <gitpath> clone... 给出了 C:\Program 不是有效路径的错误。我很困惑为什么当完全相同的代码可以毫无错误地执行 --version 命令时这会成为一个问题。

似乎正在发生的事情是引号被剥离,但只是有时。

这是违规代码:

public function execute($arguments = array(), $options = array())
{
    $command = $this->createCommandString($arguments, $options);

    $descriptorspec = array(
        1 => array('pipe', 'w'),
        2 => array('pipe', 'w'),
    );
    $pipes = array();
    $resource = proc_open($command, $descriptorspec, $pipes, realpath($this->git->getDirectory()));

    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    foreach ($pipes as $pipe) {
        fclose($pipe);
    }

    $status = trim(proc_close($resource));
    if ($status) {
        $message = "Some errors in executing git command . $command\n\n"
                 . "Output:\n"
                 . $stdout."\n"
                 . "Error:\n"
                 . $stderr;
        var_dump($message);
        throw new VersionControl_Git_Exception($message);
    } else {
        var_dump('No errors in ' . $command);
    }

    return $this->stripEscapeSequence($stdout);
}

这是两次调用代码的输出:

C:\PHP Projects\Build\vendor\pear\versioncontrol_git\VersionControl\Git\Util\Command.php:240:
string(61) "No errors in "C:\Program Files\Git\bin\git.exe" --version"
C:\PHP Projects\Build\vendor\pear\versioncontrol_git\VersionControl\Git\Util\Command.php:237:
string(306) "Some errors in executing git command . "C:\Program Files\Git\bin\git.exe" clone -q --branch="master" "--REDACTED--" "C:\PHP Projects\Build\build"

Output:

Error:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

您的问题不在于 --version,而在于您对 运行 git clone 或 [=24 执行的命令=]git结帐.

您不能使用 运行 git clone 命令或 git checkout 命令git.exe

而当你可以 运行 --version 命令时 git.exe"C:/Program Files/Git/bin/git.exe" --version

所以结论是你必须在运行宁git克隆或git检查时设置命令你的路径应该是

"C:/程序 Files/Git/bin>" git 克隆 要么 "C:/程序 Files/Git/bin>" git 签出

如果您对此仍有疑问,请告诉我。

谢谢。