Описание ошибки, возможно, может быть в STDERR.
Для этого, если использовать shell_exec, можно перенаправить вывод STDERR в STDOUT. Для этого надо добавить " 2>&1" в конец команды.
Например:
shell_exec('svn commit -m "commit message" 2>&1', $output);
После этого проверять $output. Нет гарантий, что это будет 100% работать. Разные команды бросают свой вывод по-разному.
Альтернативным вариантом c хэндлингом ошибок процесса является использование proc_open и обработкой php-потоков мануально. Пример:
$desc = [
1 => ['pipe', 'w'], // STDOUT
2 => ['pipe', 'w'], // STDERR
];
$proc = proc_open(sprintf(
self::SVN_PATH . ' commit %s %s -m %s',
$this->getCliCredentials(),
implode(' ', $toCommit),
escapeshellarg($msg)
), $desc, $pipes);
if (is_resource($proc)) {
if ($out = stream_get_contents($pipes[1])) {
file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' out: ' . print_r($out, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
}
fclose($pipes[1]);
if ($err = stream_get_contents($pipes[2])) {
file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' err: ' . print_r($err, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
}
fclose($pipes[2]);
// You can also check the process exit status
// 0 means success, otherwise error.
$exit_status = proc_close($proc);
file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' exit status: ' . print_r($exit_status, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
}