'фиксация' изменений на веб-сервере в Github-репо с использованием PHP не работает - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь написать небольшой PHP-скрипт, который может обнаружить все изменения в локальном git-репо на моем веб-сервере и отправить их в мое (личное) Github-репо.Вытягивание и извлечение из репозитория Github с использованием Atom работает отлично, пересылка изменений на веб-сервер с помощью webhook работает отлично, пересылка и извлечение обновлений на веб-сервере через командную строку работает отлично, моя проблема заключается в попытке зафиксировать и отправить обновления навеб-сервер для моего репозитория Github с использованием PHP.Как вы это делаете?

Если мне нужно изменить, добавить или даже удалить весь шаблон на сервере вручную, я могу зафиксировать эти изменения и отправить их в Github с помощью командной строки, как это без проблем:

git add --all
git commit -m "from server"
git push -u origin master

Но когда я пытаюсь сделать это, используя 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 ', он отлично работает из этих сценариев, поэтому я впотеря.

Ответы [ 4 ]

0 голосов
/ 15 октября 2018

Вы говорите:

Но когда я пытаюсь сделать это с помощью сценария 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:Существует некоторая проблема безопасности для этой методологии без аутентификации.

0 голосов
/ 12 октября 2018

Проблема с аутентификацией.Первое решение - сделать так, как сказал Роберт.Но я думаю, что не нужно заново изобретать колесо, попробуйте посмотреть этот пакет:

https://github.com/kbjr/Git.php

Все уже есть.

0 голосов
/ 15 октября 2018

Вы буквально просто повторяете строки, а не запускаете их.

Вместо echo() вы можете использовать exec(), shell_exec():

http://php.net/manual/en/function.exec.php

http://php.net/manual/en/function.shell-exec.php

Вот команды PHP, которые позволяют выполнять программы на сервере:

http://php.net/manual/en/ref.exec.php

0 голосов
/ 08 октября 2018

Когда вы запускаете скрипт с php, он запускается пользователем www-data (по умолчанию).Когда вы подключаетесь к git-репозиторию, вам нужно выполнить авторизацию.Скорее всего, это будет сделано с помощью ключа ssh.Поэтому вам необходимо авторизовать www-данные пользователя с помощью ключа ssh, чтобы он мог получить доступ к удаленному репозиторию.

Итак, шаги.

  1. Создание ключа
  2. Добавление ключав удаленный репозиторий
  3. Добавьте ключ к агенту ssh локально для пользователя www-data
  4. Проверьте среду, в которой вы запускаете команду
  5. Наслаждайтесь

Полезная ссылка: https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/

Также есть возможность использовать аутентификацию через https с пропуском ввода учетных данных.Вы можете увидеть больше здесь

Более того, есть библиотека , которая делает такие вещи, которые вы можете проверить также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...