shell_exec и git pull

Я надеялся, что кто-то может помочь, у меня есть страница PHP, которая использует shell_exec для архивирования каталога и запускает git pull для внесения последних изменений в репозиторий.

$op = shell_exec("cd /home/user/git/$repo/$dir/; zip -r /home/user/archives/$dir.$datestamp.zip $dir; cd /home/user/git/$repo/$dir/; git pull");

Зип работает нормально. Если я изменю git pull, например, на git log или git status - в моем shell_exec это тоже сработает, и я смогу увидеть файл журнала.

Просто не нравится git pull.

Я видел еще один подобный пост, но не был уверен, как это было достигнуто >> Shell_exec с git тянуть?


person williamsowen    schedule 28.02.2011    source источник
comment
Каков результат с git pull ? Вы пробовали git pull origin master или как там называются ваши ветки/пульты?   -  person Artefact2    schedule 28.02.2011
comment
Привет. git pull к сожалению ничего не возвращает, как и git pull origin master - очень странно.   -  person williamsowen    schedule 28.02.2011
comment
Ответ на другой вопрос, который вы упомянули, заключался в том, что были проблемы с правами доступа, что здесь кажется правдоподобным, поскольку git log и git status не нужно записывать в репозиторий, тогда как git pull будет. Чтобы исследовать это, я бы изменил ваш git pull на touch /tmp/whatever, а затем использовал ls -l /tmp/whatever, чтобы найти пользователя и группу, которым принадлежит файл - это скажет вам, от имени какого пользователя выполняется команда shell_exec. Если вы не можете писать в каталог репозитория как этот пользователь, это объясняет, почему git pull терпит неудачу...   -  person Mark Longair    schedule 28.02.2011
comment
ах, он пытается получить через пользователя apache, есть идеи, как я могу изменить это, чтобы вместо этого использовать определенного пользователя.. Думаю, проблема в этом! Ура снова   -  person williamsowen    schedule 28.02.2011
comment
Сборник рекомендаций по запуску git pull из php... jondavidjohn.com/b/7m   -  person jondavidjohn    schedule 06.10.2012
comment
Пожалуйста, проверьте этот обходной путь, который может быть вам полезен: stackoverflow.com/questions/9978400/   -  person DrBeco    schedule 08.06.2021


Ответы (1)


Из вашего описания в комментариях видно, что проблема в том, что ваш пользователь apache не может писать в репозиторий, что явно требуется при использовании git pull. У вас есть два варианта действий:

  1. Настройте Apache для запуска сценария от имени другого пользователя (например, с помощью suEXEC либо на виртуальном хосте или через пользовательский каталог)
  2. Измените разрешения на свой репозиторий, чтобы пользователь apache мог писать в него.

Вы должны тщательно подумать о последствиях безопасности любого из вариантов, но второй вариант, вероятно, самый простой. Если у вас еще нет такой группы, вы можете создать ее с помощью:

addgroup gitwriters

... а затем добавьте себя и пользователя Apache в эту группу:

adduser [yourusername] gitwriters
adduser apache gitwriters

Затем вы можете следовать инструкциям в еще один вопрос по изменению прав доступа к репозиторию. Повторю те, что с небольшими вариациями:

# Recursively, set the group ownership of every file and directory of your repository:
chgrp -R gitwriters /path/to/your/repo

# Recursively, make every file and directory of your repository readable and writable
# by the group:
chmod -R g+rw /path/to/your/repo

# Recursively, set the setgid of every directory in the repository.  The setgid bit
# on directories means that files created in the directory will have the same group
# ownership as the directory.  
find /path/to/your/repo -type d -print0 | xargs -0 chmod g+s

Тогда, надеюсь, ваш git pull должен работать.

person Mark Longair    schedule 28.02.2011
comment
Приветствую Марка за вашу помощь в этом. Я следовал тому, что вы сказали, в настоящее время у меня есть это: ip-xx-xxx-xx-xxx ~: id apache uid=48(apache) gid=48(apache) groups=48(apache),10(wheel),501(gitwriters) Однако при выполнении git pull он все еще запускается как apache в группе apache. Есть ли способ изменить группу по умолчанию - если это имеет смысл! Извиняюсь, новичок во всем этом, еще раз ура. - person williamsowen; 01.03.2011
comment
@williamsowen: Да, если вы следовали подходу 2, вы не меняете пользователя, под которым запускается PHP-код, вы просто даете этому пользователю (а также вашей обычной учетной записи пользователя) возможность писать в репозиторий. Вам определенно нужно, чтобы он работал от имени другого пользователя? Если это так, вам нужно изучить подход 1. - person Mark Longair; 01.03.2011