Git
英語 ▾ トピック ▾ 最新バージョン ▾ git-http-backend は 2.43.0 で最終更新されました

名前

git-http-backend - HTTP経由のGitのサーバーサイド実装

概要

git http-backend

説明

http:// および https:// プロトコルを介してリポジトリにアクセスする Git クライアントに Git リポジトリの内容を提供するシンプルな CGI プログラム。このプログラムは、スマート HTTP プロトコルと下位互換性のあるダム HTTP プロトコルの両方を使用してフェッチするクライアント、およびスマート HTTP プロトコルを使用してプッシュするクライアントをサポートします。また、適切に設定されていれば、Git のより効率的な「v2」プロトコルもサポートします。以下の環境セクションの `GIT_PROTOCOL` の説明を参照してください。

ディレクトリにマジックファイル "git-daemon-export-ok" があることを確認し、この方法でエクスポート用に明示的にマークされていない Git ディレクトリのエクスポートを拒否します (`GIT_HTTP_EXPORT_ALL` 環境変数が設定されていない限り)。

デフォルトでは、`upload-pack` サービスのみが有効になっています。これは、 *git fetch* 、 *git pull* 、および *git clone* から呼び出される *git fetch-pack* および *git ls-remote* クライアントにサービスを提供します。クライアントが認証されている場合、`receive-pack` サービスが有効になり、 *git push* から呼び出される *git send-pack* クライアントにサービスを提供します。

サービス

これらのサービスは、リポジトリごとの設定ファイルを使用して有効/無効にすることができます

http.getanyfile

これは、バージョン 1.6.6 より古い Git クライアントで、アップロードパックサービスを使用できないクライアントに対応します。有効にすると、クライアントはリポジトリ内の任意のファイルを読み取ることができます。これには、ブランチから到達できなくなったがまだ存在するオブジェクトも含まれます。デフォルトでは有効になっていますが、リポジトリはこの設定値を `false` に設定することで無効にすることができます。

http.uploadpack

これは、 *git fetch-pack* および *git ls-remote* クライアントにサービスを提供します。デフォルトでは有効になっていますが、リポジトリはこの設定値を `false` に設定することで無効にすることができます。

http.receivepack

これは、 *git send-pack* クライアントにサービスを提供し、プッシュを許可します。デフォルトでは匿名ユーザーは無効になっており、Webサーバーによって認証されたユーザーはデフォルトで有効になっています。この項目を `false` に設定することで無効にするか、匿名ユーザーを含むすべてのユーザーに対して `true` に設定することで有効にすることができます。

URL変換

ディスク上のリポジトリの場所を特定するために、 *git http-backend* は、Webサーバーによって自動的に設定される環境変数 PATH_INFO と、Webサーバー設定で手動で設定する必要がある GIT_PROJECT_ROOT を連結します。GIT_PROJECT_ROOT が設定されていない場合、 *git http-backend* は、Webサーバーによっても自動的に設定される PATH_TRANSLATED を読み取ります。

以下の例はすべて、 `http://$hostname/git/foo/bar.git` を ` /var/www/git/foo/bar.git` にマップします。

Apache 2.x

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/

# This is not strictly necessary using Apache and a modern version of
# git-http-backend, as the webserver will pass along the header in the
# environment as HTTP_GIT_PROTOCOL, and http-backend will copy that into
# GIT_PROTOCOL. But you may need this line (or something similar if you
# are using a different webserver), or if you want to support older Git
# versions that did not do that copying.
#
# Having the webserver set up GIT_PROTOCOL is perfectly fine even with
# modern versions (and will take precedence over HTTP_GIT_PROTOCOL,
# which means it can be used to override the client's request).
SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0

匿名読み取りアクセスを有効にし、認証された書き込みアクセスを有効にするには、初期 ref アドバタイズメント(クエリ文字列の service パラメーターを介してプッシュとして検出します)と receive-pack 呼び出し自体の両方の承認が必要です

RewriteCond %{QUERY_STRING} service=git-receive-pack [OR]
RewriteCond %{REQUEST_URI} /git-receive-pack$
RewriteRule ^/git/ - [E=AUTHREQUIRED:yes]

<LocationMatch "^/git/">
	Order Deny,Allow
	Deny from env=AUTHREQUIRED

	AuthType Basic
	AuthName "Git Access"
	Require group committers
	Satisfy Any
	...
</LocationMatch>

クエリ文字列と照合するために `mod_rewrite` が利用できない場合は、次のように `git-receive-pack` 自体を保護するだけで十分です

<LocationMatch "^/git/.*/git-receive-pack$">
	AuthType Basic
	AuthName "Git Access"
	Require group committers
	...
</LocationMatch>

このモードでは、サーバーは、最初の接触時ではなく、クライアントが実際にプッシュのオブジェクトネゴシエーションフェーズを開始するまで認証を要求しません。このため、プッシュを受け入れるリポジトリで `http.receivepack` 設定オプションも有効にする必要があります。 `http.receivepack` が設定されていない場合のデフォルトの動作は、認証されていないユーザーによるプッシュを拒否することです。したがって、最初の要求は、認証の機会を与えることなく、クライアントに `403 Forbidden` を報告します。

読み取りと書き込みの両方に認証を要求するには、リポジトリまたはその親ディレクトリのいずれかの周囲に Location ディレクティブを使用します

<Location /git/private>
	AuthType Basic
	AuthName "Private Git Access"
	Require group committers
	...
</Location>

同じ URL で gitweb を提供するには、 *git http-backend* が処理できる URL のみに ScriptAliasMatch を使用し、残りを gitweb に転送します

ScriptAliasMatch \
	"(?x)^/git/(.*/(HEAD | \
			info/refs | \
			objects/(info/[^/]+ | \
				 [0-9a-f]{2}/[0-9a-f]{38} | \
				 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
			git-(upload|receive)-pack))$" \
	/usr/libexec/git-core/git-http-backend/$1

ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/

単一のリポジトリ内の異なるgitnamespaces[7]から複数のリポジトリを提供するには

SetEnvIf Request_URI "^/git/([^/]*)" GIT_NAMESPACE=$1
ScriptAliasMatch ^/git/[^/]*(.*) /usr/libexec/git-core/git-http-backend/storage.git$1
高速化された静的 Apache 2.x

上記と似ていますが、Apache を使用してディスクに保存されている静的ファイルを返すことができます。多くのシステムでは、Apache がカーネルにファイルシステムからネットワークに直接ファイルの内容をコピーするように要求できるため、これがより効率的です

SetEnv GIT_PROJECT_ROOT /var/www/git

AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$          /var/www/git/$1
AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

これは gitweb 設定と組み合わせることができます

SetEnv GIT_PROJECT_ROOT /var/www/git

AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$          /var/www/git/$1
AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1
ScriptAliasMatch \
	"(?x)^/git/(.*/(HEAD | \
			info/refs | \
			objects/info/[^/]+ | \
			git-(upload|receive)-pack))$" \
	/usr/libexec/git-core/git-http-backend/$1
ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
Lighttpd

`mod_cgi`、`mod_alias`、`mod_auth`、`mod_setenv` がロードされていることを確認し、`GIT_PROJECT_ROOT` を適切に設定して、すべてのリクエストを CGI にリダイレクトします

alias.url += ( "/git" => "/usr/lib/git-core/git-http-backend" )
$HTTP["url"] =~ "^/git" {
	cgi.assign = ("" => "")
	setenv.add-environment = (
		"GIT_PROJECT_ROOT" => "/var/www/git",
		"GIT_HTTP_EXPORT_ALL" => ""
	)
}

匿名読み取りアクセスを有効にし、認証された書き込みアクセスを有効にするには

$HTTP["querystring"] =~ "service=git-receive-pack" {
	include "git-auth.conf"
}
$HTTP["url"] =~ "^/git/.*/git-receive-pack$" {
	include "git-auth.conf"
}

ここで、 `git-auth.conf` は次のようになります

auth.require = (
	"/" => (
		"method" => "basic",
		"realm" => "Git Access",
		"require" => "valid-user"
	       )
)
# ...and set up auth.backend here

読み取りと書き込みの両方に認証を要求するには

$HTTP["url"] =~ "^/git/private" {
	include "git-auth.conf"
}

環境

*git http-backend* は、以下を含む、呼び出し元の Web サーバーによって設定された `CGI` 環境変数に依存します

  • PATH_INFO(GIT_PROJECT_ROOT が設定されている場合、それ以外の場合は PATH_TRANSLATED)

  • REMOTE_USER

  • REMOTE_ADDR

  • CONTENT_TYPE

  • QUERY_STRING

  • REQUEST_METHOD

`GIT_HTTP_EXPORT_ALL` 環境変数は、リポジトリのエクスポートを許可する前に、各リポジトリの "git-daemon-export-ok" ファイルのチェックをバイパスするために *git-http-backend* に渡すことができます。

`GIT_HTTP_MAX_REQUEST_BUFFER` 環境変数(または `http.maxRequestBuffer` 設定オプション)を設定して、フェッチ中に git が処理する最大 ref ネゴシエーション要求を変更できます。より大きなバッファを必要とするフェッチは成功しません。この値は通常変更する必要はありませんが、非常に多数の ref を持つリポジトリからフェッチする場合に役立つ場合があります。値は単位で指定できます(例:100メガバイトの場合は `100M`)。デフォルトは 10 メガバイトです。

クライアントは、`Git-Protocol` HTTP ヘッダーを使用して、オプションのプロトコル機能(v2 プロトコルなど)をプローブできます。これらをサポートするには、そのヘッダーの内容が `GIT_PROTOCOL` 環境変数に表示される必要があります。ほとんどの Web サーバーは、`HTTP_GIT_PROTOCOL` 変数を介してこのヘッダーを CGI に渡し、`git-http-backend` はそれを自動的に `GIT_PROTOCOL` にコピーします。ただし、一部の Web サーバーは渡すヘッダーをより選択的に選択する場合があり、その場合は明示的に設定する必要があります(前の例のセクションの Apache 設定での `Git-Protocol` の記述を参照)。

バックエンドプロセスは GIT_COMMITTER_NAME を * $REMOTE_USER* に、GIT_COMMITTER_EMAIL を *${REMOTE_USER}@http.${REMOTE_ADDR}* に設定し、 *git-receive-pack* によって作成された reflog にプッシュを実行したリモートユーザーの識別情報が含まれるようにします。

すべての `CGI` 環境変数は、 *git-receive-pack* によって呼び出される各フックで使用できます。

GIT

git[1] スイートの一部

scroll-to-top