2011-02-28 146 views
1

我希望有人可以帮忙,我有一个PHP页面,它使用shell_exec来压缩一个目录并运行git pull来降低最近的存储库更改。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 loggit status - 在我的shell_exec中,这也适用,并且我可以看到日志文件。

只是似乎不喜欢git拉。

我看到了另一个类似的帖子这一点,但不知道它是怎么实现>>Shell_exec with git pull?

+0

'git pull'的输出是什么?你有没有试过'git pull origin master'或者你的分支/遥控器的名字是什么? – Artefact2 2011-02-28 15:45:32

+0

你好...'git pull'不会遗漏任何东西,'git pull origin master'也不会 - 很奇怪。 – williamsowen 2011-02-28 15:50:05

+0

您提到的另一个问题的答案是存在权限问题,这似乎是合理的,因为'git log'和'git status'不需要写入存储库,而'git pull'会。为了研究这一点,我会将你的'git pull'改为'touch/tmp/whatever',然后使用'ls -l/tmp/whatever'来找到拥有这个文件的用户和组 - 这会告诉你用户是什么'shell_exec'命令正在运行。如果你不能以该用户的身份写入存储库目录,那么这就可以解释为什么'git pull'失败...... – 2011-02-28 16:05:44

回答

4

从你的描述中看来,问题是,你的apache用户不能写入仓库的意见,这在使用git pull时显然是必需的。你有两项行动:

  1. 安装Apache才能运行该脚本作为另一个用户(例如,使用suEXEC要么on a VirtualHost or via userdir
  2. 变化你的资料库中的权限,这样apache用户可以写入

您应该仔细考虑任一选择的安全影响,但第二种选择可能是最简单的。如果你还没有这样一个小组,你可以创建它:

addgroup gitwriters 

...然后自己和Apache用户添加到该组:

adduser [yourusername] gitwriters 
adduser apache gitwriters 

然后你就可以按照another question中的说明更改存储库的权限。重申那些有一些细微的变化:

# 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应该工作。

+0

干杯标记为您提供帮助。我已经按照你说的话, 目前我有这样的: 'IP-XX-XXX-XX-XXX〜:ID阿帕奇 的uid = 48(阿帕奇)GID = 48(阿帕奇)组= 48(阿帕奇) ,10(wheel),501(gitwriters)' 然而,当执行'git pull'时,它仍然在Apache组下运行。是否有办法改变默认组 - 如果有意义!对于这一切颇为新鲜的道歉,再次欢呼。 – williamsowen 2011-03-01 12:11:23

+0

@williamsowen:是的,如果你遵循方法2,你不会改变PHP代码运行的用户,你只是让该用户(以及你平常的用户帐户)能够写入存储库。你确实需要让它作为一个不同的用户来运行吗?如果是这样,你需要看看方法1。 – 2011-03-01 12:22:40