Выполнение команд git через PHP
Как можно выполнить команды git, такие как git add .
и git commit -m
, используя php?
Именно для проекта создается централизованное хранилище для поддержки академических проектов.
exec(), похоже, не работает.
<?php
$path = "/var/www/repos/$_POST[project]";
$a='';
chdir($path);
exec("git add .");
exec("git commit -m'message'");
echo "<h3 align = center> Succesfully commited all the files.</h3>";
?>
Ответы
Ответ 1
Это определенно возможно. Я реализовал его в одном из моих проектов.
Однако вы должны быть осторожны с разрешениями.
В linux обычно команда exec
будет выполняться с использованием пользователя www-data
.
Поэтому вы должны разрешить www-data
писать и читать в вашем рабочем каталоге.
Один быстрый и грязный способ сделать это: chmod o+rw -R git_directory
Ответ 2
Я нашел довольно простые решения для 2 проблем здесь
1) Git вытащите из защищенного пульта без использования пароля
- создайте пары ключей ssh, используя
ssh-keygen
- загрузить открытый ключ в ur Git удаленный хост
-
настроить файл ~/.ssh/config для добавления инструкции использовать этот сгенерированный закрытый ключ git
host gitlab.com
HostName gitlab.com
IdentityFile ~/.ssh/private_key
User git
Теперь все команды Git будут использовать эту private_key для подключения к удаленному
2) Выполнение команды Git пользователя www-datastrong >
-
обновить файл sudoers, чтобы пользователь www-data мог запускать команды Git, чтобы редактировать следующую команду
$ sudo visudo
добавить следующую строку под пользовательские настройки
www-data ALL=(raaghu) NOPASSWD: /usr/bin/git
Значение www-data
Пользователь из ALL
терминалов, действующих как raaghu
, может запускать /usr/bin/git
с помощью NOPASSWD
Обратите внимание: не пытайтесь использовать этот метод, если вы не понимаете файл sudoers, иначе это может создать уязвимость безопасности
-
Создайте git -pull.sh файл для запуска Git команд
cd /var/www/my-repo
sudo -u raaghu git pull origin
-
запустите этот git -pull.sh файл с php
exec("/bin/bash /var/www/git-pull.sh");
Ответ 3
Существует еще одно решение, которое заключается в просто использовании так называемых обратных ссылок php
$message = `git log -1 --pretty=%B`; // get commit message
или
$deploy_tag = `git describe --tags`; // get commit tags
или
$hash = `git log -1 --pretty=%h`; // get the hash
Ответ 4
Сначала я запускаю тест против моего экземпляра сервера bitbucket, чтобы выводить на экран сообщения об ошибках:
echo shell_exec("cd /website/root/htdocs && git status 2>&1");
это породило ошибку, которая не могла найти команду git, следовательно, должна была предоставить полный путь к git двоичному:
'which git'
(далее называется YOU_FULL_GIT_BINARY_PATH_HERE):
/usr/local/git/bin/git
Полный путь, например. '/usr/local/ git/bin/git status' теперь успешно выполняет команды git.
Это не отменяет пароль git, необходимый для использования команды git pull 'для набора в пользователе .git/config git. Выполнение команды ниже в git repo:
git config credential.helper store
[команда] [1] запросит пароль и позволит вам сохранить его локально незашифрованным (защищенным только файловой системой, например, в /root/.git-credentials). Это позволит запустить 'git pull', не запрашивая пароль. В качестве альтернативы (возможно, лучше) необходимо сгенерировать ключи ssh для вашего веб-сервера, такие как apached, затем добавить их в свои пользовательские аккаунты или файлы repo.
Все мои папки были настроены на принадлежность пользователю apache (другие версии Centos 6.8 могут быть www-данными: www-data и т.д.):
chown -R apache:apache YOUR_WEB_FODLER
Мне не нужно было использовать грязный трюк "chmod o + rw -R", чтобы все работало.