Git更新后挂钩无法执行';吉特拉力';使用sudo

Git更新后挂钩无法执行';吉特拉力';使用sudo,git,sudo,Git,Sudo,对于一个新的web开发项目,我配置了一个带有更新后挂钩的共享repo,该挂钩会自动将更新拉入web服务器虚拟根目录 #!/bin/sh cd /srv/www/siteA/ || exit unset GIT_DIR git pull hub master exec git-update-server-info 但是,web服务器运行SUPPP,它强制每个文件归用户“www run”所有。但是,由于更新后脚本在启动git推送的用户的上下文中运行,因此更新后的文件由用户所有,而不是由www运

对于一个新的web开发项目,我配置了一个带有更新后挂钩的共享repo,该挂钩会自动将更新拉入web服务器虚拟根目录

#!/bin/sh

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

exec git-update-server-info
但是,web服务器运行SUPPP,它强制每个文件归用户“www run”所有。但是,由于更新后脚本在启动git推送的用户的上下文中运行,因此更新后的文件由用户所有,而不是由www运行。我认为最好的解决方案是在www-run用户使用sudo时启动git-pull,因此我用以下行更新了sodoers(“webmaster”是一个所有git用户都是其成员的组):

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

sudo -u www-run /usr/bin/git pull hub master
但是我在执行git推送的客户端上收到以下错误

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

因为我已经指定默认情况下不需要tty,也不需要密码,所以我无法理解为什么这不起作用。

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

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

我把下面的线移到了尽头,它成功了

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

requirety
默认为关闭,因此您不需要该行。您看到的错误与sudoers中的那行由于某种原因不匹配的错误是一致的-只是猜测一下,是否可能该组实际上被称为
webmasters
,而不是
webmaster
,或者另一个用户实际上是
www-data
而不是
www-run
或其他什么?如果在钩子脚本顶部添加命令
groups
,那么远程输出中是否明确列出了该组?@MarkLongair-谢谢。我可以作为webmaster组的成员手动运行该命令,并按预期工作(sudo-uwww-run/usr/bin/git-pull-hub-master)。Sudo正在工作,它一定与通过SSH远程运行的命令有关。@Michelle你有过这样的工作吗?我正试图从我的笔记本电脑更新回购协议,却一直收到相同的错误。@Ian是的,我回答了我自己的问题,请参见下文。只是一个小问题,您的存储库是否位于
usr/bin/git
?Samin,上面的答案将运行git命令,而不需要密码
%webmaster      ALL=(www-run)  NOPASSWD: /usr/bin/git