对于一个新的 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。我认为最好的解决方案是使用 sudo 以 www-run 用户身份启动 git pull 所以我用以下几行更新了 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 并且不需要密码,所以我无法弄清楚为什么这不起作用。