2

新しい 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 が不要で、パスワードが不要であることを指定したので、これが機能しない理由がわかりません。

4

1 に答える 1

2

問題は、sudoers ファイル内のユーザー指定の順序にありました。マニュアルページから

複数のエントリがユーザーに一致する場合、それらは順番に適用されます。複数の一致がある場合は、最後の一致が使用されます (必ずしも最も具体的な一致とは限りません)。

下の行を最後に移動したところ、うまくいきました。

%webmaster      ALL=(www-run)  NOPASSWD: /usr/bin/git
于 2012-10-07T08:53:35.133 に答える