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

名前

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

概要

git http-backend

説明

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

このプログラムは、ディレクトリにマジックファイル「git-daemon-export-ok」が存在するかどうかを確認し、この方法で明示的にエクスポートが許可されていないGitディレクトリのエクスポートを拒否します(GIT_HTTP_EXPORT_ALL環境変数が設定されている場合を除く)。

デフォルトでは、upload-packサービスのみが有効になっています。これは、git fetchgit 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に設定すると匿名ユーザーを含むすべてのユーザーに対して有効にできます。

http.uploadarchive

これは、HTTP/HTTPSプロトコルを介したリモートアーカイブのためにgit archiveクライアントにサービスを提供します。デフォルトでは無効になっています。プロトコルv2でのみ動作します。

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

匿名読み取りアクセスと認証済み書き込みアクセスを有効にするには、初期リファレンス広告(クエリ文字列のサービスパラメータを介してプッシュとして検出されます)と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_cgimod_aliasmod_authmod_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-http-backendに渡すことで、各リポジトリの「git-daemon-export-ok」ファイルのチェックをバイパスし、そのリポジトリのエクスポートを許可することができます。

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

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

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

すべてのCGI環境変数は、git-receive-packによって呼び出される各フックで利用可能です。

GIT

git[1]スイートの一部

scroll-to-top