Вы говорите:
Но когда я пытаюсь сделать это с помощью сценария PHP, он никогда не работает, и я не получаю сообщение об ошибке (я даже пытаюсь с паузами):
$output = `git add --all`;
echo $output;
sleep(1);
$output = `git commit -m "from server"`;
echo $output;
sleep(3);
$output = `git push -u origin master`;
echo $output;
sleep(3);
Если я запускаю что-то простое, например, 'git --version', 'git config --list' или 'git status', это прекрасно работает из этих сценариев, поэтому я в растерянности.
Похоже, у вас нет разрешения на запись здесь.
Вы можете легко запустить следующие команды, чтобы проверить разрешение для git repo, пользователя входа в систему и владельца веб-сервера.
Выполнить команду whoami
илиid
для идентификации пользователя для входа в систему.
$ whoami
gasolwu
$ id
uid=501(gasolwu) gid=20(staff) groups=20(staff),501(access_bpf),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),701(com.apple.sharepoint.group.1)
Список каталогов для проверки владельца и разрешений для данного пути (git repo)
$ ls -al /path/to/repo
total 16
drwxr-xr-x 5 gasolwu staff 160 Oct 15 21:50 ./
drwxr-xr-x 5 gasolwu staff 160 Oct 15 21:48 ../
drwxr-xr-x 13 gasolwu staff 416 Oct 15 21:53 .git/
-rw-r--r-- 1 gasolwu staff 196 Oct 15 21:50 git.php*
-rw-r--r-- 1 gasolwu staff 79 Oct 15 21:49 git.sh*
Отображение статуса процесса для проверки пользователя, который запускает веб-сервер
$ ps auxwww | grep 'httpd\|nginx\|apache'
_www 1139 0.0 0.0 4342760 3692 ?? S 9:51PM 0:00.01 /usr/sbin/httpd -D FOREGROUND
_www 1138 0.0 0.0 4351976 3692 ?? S 9:51PM 0:00.02 /usr/sbin/httpd -D FOREGROUND
_www 1137 0.0 0.0 4317160 1988 ?? S 9:51PM 0:00.01 /usr/sbin/httpd -D FOREGROUND
_www 1129 0.0 0.0 4334568 2300 ?? S 9:51PM 0:00.01 /usr/sbin/httpd -D FOREGROUND
root 1119 0.0 0.1 4316156 11772 ?? Ss 9:51PM 0:00.51 /usr/sbin/httpd -D FOREGROUND
gasolwu 1465 0.0 0.0 4268036 824 s000 S+ 10:19PM 0:00.00 grep --color=auto -d skip httpd\|nginx\|apache
или проверьте пользователя php-fpm, если вы запускаете веб-сервер с PHP-FPM
$ ps auxwww | grep php-fpm
gasolwu 1761 0.0 0.0 4268036 812 s000 S+ 10:33PM 0:00.00 grep --color=auto -d skip php-fpm
nobody 1737 0.0 0.0 4323216 724 ?? S 10:33PM 0:00.00 php-fpm
nobody 1736 0.0 0.0 4323216 732 ?? S 10:33PM 0:00.00 php-fpm
root 1735 0.0 0.0 4323216 920 ?? Ss 10:33PM 0:00.00 php-fpm
Как вы можете видеть, здесь также есть проблема с правами доступа, .git
Каталог может быть написан только пользователем gasolwu
, а не веб-пользователем _www
.Поэтому, когда вы запускаете git-операцию через php-скрипт через веб-сервер..Не удается выполнить операцию git (добавить / зафиксировать) без разрешения на запись.
Функция shell_exec (идентична оператору backtick
) возвращает только стандартный вывод, здесь он пуст, когдавозникает ошибка, Stderr будет перенаправлен в журнал ошибок в вашей среде, вы получите похожий журнал сообщений об ошибках в Apache или PHP.
$ cat /var/log/apache2/error_log
Mon Oct 15 21:51:06.734474 2018] [mpm_prefork:notice] [pid 1119] AH00163: Apache/2.4.34 (Unix) PHP/7.1.19 configured -- resuming normal operations
[Mon Oct 15 21:51:06.734572 2018] [core:notice] [pid 1119] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
fatal: Unable to create '/path/to/repo/.git/index.lock': Permission denied
fatal: Unable to create '/path/to/repo/.git/index.lock': Permission denied
error: could not lock config file .git/config: Permission denied
error: Unable to write upstream branch configuration
hint:
hint: After fixing the error cause you may try to fix up
hint: the remote tracking information by invoking
hint: "git branch --set-upstream-to=origin/master".
error: update_ref failed for ref 'refs/remotes/origin/master': cannot lock ref 'refs/remotes/origin/master': Unable to create '/path/to/repo/.git/refs/remotes/origin/master.lock': Permission denied
Everything up-to-date
error: remote unpack failed: unable to create temporary object directory
To /tmp/git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to '/tmp/git'
Давайте исправим это, предоставив права на запись нужному пользователю (_www здесь).
chown -R _www /path/to/repo
После этого вы можете отправить запрос на http://example.com/git.php, чтобы добавить файлы, зафиксировать с сообщением "с сервера", а затем отправить их на GitHub.
CAVEAT:Существует некоторая проблема безопасности для этой методологии без аутентификации.