【问题标题】:Git post-update hook fails to execute 'git pull' using sudoGit 更新后挂钩无法使用 sudo 执行“git pull”
【发布时间】:2012-10-06 10:09:05
【问题描述】:

对于一个新的 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 并且不需要密码,所以我无法弄清楚为什么这不起作用。

【问题讨论】:

  • requiretty 无论如何默认为关闭,因此您不需要该行。您看到的错误将与 sudoers 中由于某种原因不匹配的那一行一致 - 只是猜测,该组是否可能实际上被称为 webmasters 而不是 webmaster,或者另一个用户真的是 @987654328 @ 而不是 www-run 什么的?如果您在钩子脚本的顶部添加命令groups,那么该组是否肯定会列在远程输出中?
  • @MarkLongair - 谢谢。我可以作为 webmaster 组的成员手动运行该命令,并且它可以按预期工作(sudo -u www-run /usr/bin/git pull hub master)。 sudo 是为此工作的,它必须与通过 SSH 远程运行的命令有关。
  • @Michelle 你有没有得到这个工作?我正在尝试从我的笔记本电脑更新存储库并不断收到相同的错误。
  • @Ian 是的,我回答了我自己的问题,见下文。

标签: git sudo


【解决方案1】:

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

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

我将下面的行移到最后,它起作用了。

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

【讨论】:

  • 问个小问题,你的仓库在usr/bin/git吗?
  • Samin,上面的答案将运行 git 命令而无需密码
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2013-08-18
  • 2017-05-03
  • 2012-03-22
相关资源
最近更新 更多