私だけがプッシュできる「スマート」HTTP経由でgitリポジトリを利用できるようにしたいのですが、誰でも(またはアカウントを持っている人なら誰でも)クローン/フェッチできます。
git-http-backend(1)マンページには、次の Apache Web サーバーの設定例があります。
mod_cgi、mod_alias、および mod_env が有効になっていることを確認し、GIT_PROJECT_ROOT (または DocumentRoot) を適切に設定して、CGI に ScriptAlias を作成します。
SetEnv GIT_PROJECT_ROOT /var/www/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
匿名の読み取りアクセスと認証済みの書き込みアクセスを有効にするには、LocationMatch ディレクティブによる承認が必要です。
<LocationMatch "^/git/.*/git-receive-pack$"> AuthType Basic AuthName "Git Access" Require group committers #... </LocationMatch>
残念ながら、この構成は機能しません。認証を必要とせずに、問題なくリポジトリをフェッチ/クローンできますが、プッシュは失敗します:
$ git push origin master
error: Cannot access URL http://localhost/git/test.git/, return code 22
fatal: git-http-push failed
Apache Web サーバーを調べerror.log
ても役に立ちません。
[...] サービスが有効になっていません: 'receive-pack' [...] リクエストはサポートされていません: '/var/www/git/test.git/'
は、最初にクエリベースの URL でGET メソッドを使用するaccess.log
ことを示していますが、これは LocationMatch ディレクティブではカバーされていません。git push
/git/test.git/info/refs?service=git-receive-pack
[...] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 403 304 "-" "git/1.7.10.4" [...] "GET /git/test.git/info/refs HTTP/1.1" 200 267 "-" "git/1.7.10.4" [...] "GET /git/test.git/HEAD HTTP/1.1" 200 337 "-" "git/1.7.10.4" [...] "PROPFIND /git/test.git/ HTTP/1.1" 404 250 "-" "git/1.7.10.4"
(次の行は、「ダム」WebDAV ベースの HTTP プッシュへのフォールバックに関するものです。このフォールバックを無効にすることは可能ですか?)。
今のところ、次の回避策を使用します。フェッチとプッシュの両方に有効なユーザーを必要とし ( git-http-backend(1)マンページの「読み取りと書き込みの両方の認証」の例から変更された構成を使用)、プッシュを単一のユーザーに制限します環境変数を調べてpre-receive
フックします。REMOTE_USER