Git post-update hook无法使用sudo执行'git pull'

时间:2012-10-06 10:09:06

标签: git sudo

对于一个新的Web开发项目,我已经配置了一个带有更新后挂钩的共享仓库,它会自动将更新提取到Web服务器虚拟根目录中。

#!/bin/sh

cd /srv/www/siteA/ || exit
unset GIT_DIR
git pull hub master

exec git-update-server-info

但是,Web服务器运行suphp,强制每个文件由用户'www-run'拥有。但是,由于更新后的脚本在启动git push的用户的上下文中运行,因此更新的文件由用户拥有,而不是www-run。我认为最好的解决方案是启动git pull作为使用sudo的www-run用户,所以我用以下行更新了sodoers('webmaster'是所有git用户所属的组):

Defaults:%webmaster !requiretty
%webmaster      ALL=(www-run)  NOPASSWD: /usr/bin/git

在更新后的脚本中,我将 git pull 行更改为

sudo -u www-run /usr/bin/git pull hub master

但是我在执行git push的客户端上收到以下错误

remote: sudo: no tty present and no askpass program specified

由于我已经指定在默认情况下不需要tty并且不需要密码我无法弄清楚为什么这不起作用。

1 个答案:

答案 0 :(得分:2)

问题在于sudoers文件中用户规范的排序。从手册页

  

当多个条目与用户匹配时,它们将按顺序应用。   如果有多个匹配项,则使用最后一个匹配项(不是   必然是最具体的匹配)。

我将下面的一行移到了最后,然后才有效。

%webmaster      ALL=(www-run)  NOPASSWD: /usr/bin/git