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

名前

git-daemon - Gitリポジトリ用の非常にシンプルなサーバー

概要

git daemon [--verbose] [--syslog] [--export-all]
	     [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]
	     [--strict-paths] [--base-path=<path>] [--base-path-relaxed]
	     [--user-path | --user-path=<path>]
	     [--interpolated-path=<pathtemplate>]
	     [--reuseaddr] [--detach] [--pid-file=<file>]
	     [--enable=<service>] [--disable=<service>]
	     [--allow-override=<service>] [--forbid-override=<service>]
	     [--access-hook=<path>] [--[no-]informative-errors]
	     [--inetd |
	      [--listen=<host-or-ipaddr>] [--port=<n>]
	      [--user=<user> [--group=<group>]]]
	     [--log-destination=(stderr|syslog|none)]
	     [<directory>…​]

説明

通常はポート "DEFAULT_GIT_PORT" つまり 9418 で listen する、非常にシンプルな TCP Git デーモンです。サービスを要求する接続を待ち、サービスが有効になっている場合はそのサービスを提供します。

ディレクトリにマジックファイル "git-daemon-export-ok" があることを確認し、この方法で明示的にエクスポートがマークされていない Git ディレクトリのエクスポートを拒否します (--export-all パラメータが指定されている場合を除く)。 git daemon 引数としてディレクトリパスを渡すと、提供はそれらのディレクトリ内のリポジトリに限定されます。

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

これは、読み取り専用の更新、つまり Git リポジトリからのプルに最適です。

git archive にサービスを提供するための upload-archive も存在します。

オプション

--strict-paths

パスを正確に一致させます(つまり、実際のパスが "/foo/repo.git" または "/foo/repo/.git" の場合、"/foo/repo" を許可しません)。また、ユーザー相対パスを実行しません。このオプションが有効で、ディレクトリ引数が指定されていない場合、 *git daemon* は起動を拒否します。

--base-path=<パス>

すべてのパスリクエストを、指定されたパスを基準とした相対パスとして再マップします。これは一種の「Git ルート」です。 example.com で *git daemon* を *--base-path=/srv/git* で実行すると、後で *git://example.com/hello.git* をプルしようとすると、*git daemon* はパスを `/srv/git/hello.git` として解釈します。

--base-path-relaxed

--base-path が有効で、リポジトリの検索に失敗した場合、このオプションを使用すると、*git daemon* はベースパスをプレフィックスせずに検索を試みます。これは、古いパスを引き続き許可しながら、--base-path の使用に切り替える場合に便利です。

--interpolated-path=<パス template>

バーチャルホスティングをサポートするために、補間されたパス template を使用して代替パスを動的に構築できます。この template は、クライアントによって提供されたがすべて小文字に変換されたターゲットホスト名には %H、正規ホスト名には %CH、サーバーの IP アドレスには %IP、ポート番号には %P、名前付きリポジトリの絶対パスには %D をサポートします。補間後、パスはディレクトリリストに対して検証されます。

--export-all

*git-daemon-export-ok* ファイルがなくても、Git リポジトリのように見える(*objects* および *refs* サブディレクトリを持つ)すべてのディレクトリからのプルを許可します。

--inetd

サーバーを inetd サービスとして実行します。 --syslog を意味します(`--log-destination=` でオーバーライドされる場合があります)。 --detach、--port、--listen、--user、および --group オプションとは互換性がありません。

--listen=<ホストまたは IP アドレス>

特定の IP アドレスまたはホスト名で listen します。IP アドレスは、IPv4 アドレスまたはサポートされている場合は IPv6 アドレスのいずれかになります。IPv6 がサポートされていない場合、--listen=<ホスト名> もサポートされておらず、--listen には IPv4 アドレスを指定する必要があります。複数回指定できます。 `--inetd` オプションとは互換性がありません。

--port=<n>

代替ポートで listen します。 `--inetd` オプションとは互換性がありません。

--init-timeout=<n>

接続が確立されてからクライアントリクエストが受信されるまでのタイムアウト(秒単位)(通常は非常に低い値です。基本的にすぐに実行される必要があるためです)。

--timeout=<n>

特定のクライアントサブリクエストのタイムアウト(秒単位)。これには、サーバーがサブリクエストを処理するのにかかる時間と、次のクライアントのリクエストを待つのにかかる時間が含まれます。

--max-connections=<n>

同時クライアントの最大数。デフォルトは 32 です。制限なしの場合はゼロに設定します。

--syslog

`--log-destination=syslog` の省略形です。

--log-destination=<宛先>

ログメッセージを指定された宛先に送信します。このオプションは --verbose を意味しないため、デフォルトではエラー状態のみがログに記録されることに注意してください。 <宛先> は次のいずれかである必要があります

stderr

標準エラーに書き込みます。 `--detach` が指定されている場合、プロセスは実際の標準エラーから切断され、この宛先は事実上 `none` と同等になることに注意してください。

syslog

`git-daemon` 識別子を使用して、syslog に書き込みます。

none

すべてのログ記録を無効にします。

デフォルトの宛先は、`--inetd` または `--detach` が指定されている場合は `syslog`、それ以外の場合は `stderr` です。

--user-path
--user-path=<パス>

リクエストで ~user 表記を使用できるようにします。パラメータなしで指定した場合、git://host/~alice/foo へのリクエストは、ユーザー `alice` のホームディレクトリにある *foo* リポジトリへのアクセスリクエストと見なされます。 `--user-path=<パス>` が指定されている場合、同じリクエストは、ユーザー `alice` のホームディレクトリにある `<パス>/foo` リポジトリへのアクセスリクエストと見なされます。

--verbose

着信接続と要求されたファイルに関する詳細をログに記録します。

--reuseaddr

リスニングソケットをバインドするときに SO_REUSEADDR を使用します。これにより、サーバーは古い接続がタイムアウトするのを待たずに再起動できます。

--detach

シェルからデタッチします。 --syslog を意味します。

--pid-file=<ファイル>

プロセスIDを *ファイル* に保存します。デーモンが `--inetd` で実行されている場合は無視されます。

--user=<ユーザー>
--group=<グループ>

サービスループに入る前に、デーモンの uid と gid を変更します。 `--group` なしで `--user` のみが指定されている場合、ユーザーのプライマリグループ ID が使用されます。オプションの値は `getpwnam(3)` と `getgrnam(3)` に渡され、数値 ID はサポートされていません。

これらのオプションを `--inetd` と一緒に使用するとエラーになります。必要に応じて *git daemon* を生成する前に、inet デーモンの機能を使用して同じことを実現してください。

ユーザーIDを切り替える多くのプログラムと同様に、デーモンは、`upload-pack` や `receive-pack` など、git プログラムを実行するときに `$HOME` などの環境変数をリセットしません。このオプションを使用する場合は、デーモンを起動する前に `HOME` を `<user>` のホームディレクトリを指すように設定してエクスポートし、そのディレクトリにある Git 設定ファイルが `<user>` で読み取り可能であることを確認することもできます。

--enable=<サービス>
--disable=<サービス>

デフォルトで、サービスをサイト全体で有効/無効にします。サイト全体で無効になっているサービスでも、オーバーライド可能としてマークされていて、リポジトリが設定項目でサービスを有効にしている場合は、リポジトリごとに有効にすることができます。

--allow-override=<サービス>
--forbid-override=<サービス>

リポジトリごとの設定でサイト全体のデフォルトをオーバーライドすることを許可/禁止します。デフォルトでは、すべてのサービスがオーバーライド可能です。

--[no-]informative-errors

情報エラーが有効になっている場合、git-daemon はクライアントにより詳細なエラーを報告し、「そのようなリポジトリはありません」と「リポジトリはエクスポートされていません」などの状態を区別します。これはクライアントにとっては便利ですが、エクスポートされていないリポジトリの存在に関する情報が漏洩する可能性があります。情報エラーが有効になっていない場合、すべてのエラーはクライアントに「アクセスが拒否されました」と報告されます。デフォルトは --no-informative-errors です。

--access-hook=<パス>

クライアントが接続するたびに、最初に <パス> で指定された外部コマンドを、サービス名(例:「upload-pack」)、リポジトリへのパス、ホスト名(%H)、正規ホスト名(%CH)、IPアドレス(%IP)、およびTCPポート(%P)を引数として実行します。外部コマンドは、ゼロ以外のステータスで終了することによりサービスを拒否するか(またはゼロのステータスで終了することにより許可するか)を決定できます。また、この決定を行う際に、$REMOTE_ADDR および $REMOTE_PORT 環境変数を参照して、リクエスト元に関する情報を取得することもできます。

外部コマンドは、オプションで、サービスを拒否したときにエラーメッセージとしてリクエスト元に送信される単一行を標準出力に書き込むことができます。

<ディレクトリ>

残りの引数はディレクトリのリストを提供します。ディレクトリが指定されている場合、`git-daemon` プロセスは、要求されたディレクトリがこれらのディレクトリのいずれかに含まれている場合にのみ、そのディレクトリを提供します。`--strict-paths` が指定されている場合、要求されたディレクトリはこれらのディレクトリのいずれかと正確に一致する必要があります。

サービス

これらのサービスは、このコマンドのコマンドラインオプションを使用してグローバルに有効/無効にすることができます。よりきめ細かい制御が必要な場合(たとえば、デーモンが提供する少数の選択されたリポジトリでのみ *git archive* の実行を許可する場合)、リポジトリごとの設定ファイルを使用して有効または無効にすることができます。

upload-pack

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

upload-archive

これは *git archive --remote* を提供します。デフォルトでは無効になっていますが、リポジトリは `daemon.uploadarch` 設定項目を `true` に設定することで有効にすることができます。

receive-pack

これは *git send-pack* クライアントを提供し、匿名プッシュを許可します。プロトコルには認証が *ない* ため、デフォルトでは無効になっています(つまり、誰でもリポジトリに anything をプッシュでき、ref の削除も含まれます)。これは、全員が友好的な閉じたLAN設定のみを対象としています。このサービスは、`daemon.receivepack` 設定項目を `true` に設定することで有効にすることができます。

/etc/services に以下の設定があると仮定します
$ grep 9418 /etc/services
git		9418/tcp		# Git Version Control System
inetd サーバーとしての *git daemon*

`/pub/foo` または `/pub/bar` 内の任意のリポジトリを処理する inetd サービスとして *git daemon* を設定するには、`/etc/inetd` に以下のようなエントリを1行で追加します

	git stream tcp nowait nobody  /usr/bin/git
		git daemon --inetd --verbose --export-all
		/pub/foo /pub/bar
仮想ホスト用の inetd サーバーとしての *git daemon*

異なる仮想ホスト `www.example.com` と `www.example.org` のリポジトリを処理する inetd サービスとして *git daemon* を設定するには、`/etc/inetd` に以下のようなエントリを1行で追加します

	git stream tcp nowait nobody /usr/bin/git
		git daemon --inetd --verbose --export-all
		--interpolated-path=/pub/%H%D
		/pub/www.example.org/software
		/pub/www.example.com/software
		/software

この例では、ルートレベルのディレクトリ `/pub` には、サポートされている各仮想ホスト名に対応するサブディレクトリが含まれます。さらに、両方のホストはリポジトリを単に `git://www.example.com/software/repo.git` としてアドバタイズします。1.4.0 より前のクライアントの場合は、`/software` から適切なデフォルトリポジトリへのシンボリックリンクを作成することもできます。

仮想ホスト用の通常のデーモンとしての *git daemon*

IPアドレスに基づいて複数の仮想ホストのリポジトリを処理する、通常の非 inetd サービスとして *git daemon* を設定するには、デーモンを次のように起動します

	git daemon --verbose --export-all
		--interpolated-path=/pub/%IP/%D
		/pub/192.168.1.200/software
		/pub/10.10.220.23/software

この例では、ルートレベルのディレクトリ `/pub` には、サポートされている各仮想ホストのIPアドレスに対応するサブディレクトリが含まれます。リポジトリは、これらの IP アドレスに対応している限り、ホスト名でアクセスできます。

リポジトリごとにサービスを選択的に有効/無効にする

リポジトリに対して *git archive --remote* を有効にし、*git fetch* を無効にするには、リポジトリの設定ファイル(`HEAD`、`refs`、`objects` と同じディレクトリにある *config* ファイル)に以下を記述します。

	[daemon]
		uploadpack = false
		uploadarch = true

環境

*git daemon* は、クライアントの IP アドレスが利用可能な場合、REMOTE_ADDR を接続元のクライアントの IP アドレスに設定します。REMOTE_ADDR は、サービスが実行されたときに呼び出されるフックの環境で利用できます。

GIT

git[1] スイートの一部

scroll-to-top