日本語 ▾ トピック ▾ 最新バージョン ▾ gitnamespaces は 2.32.0 で最終更新されました

名前

gitnamespaces - Git の名前空間

概要

GIT_NAMESPACE=<namespace> git upload-pack
GIT_NAMESPACE=<namespace> git receive-pack

説明

Gitは単一のリポジトリの参照(refs)を複数の名前空間に分割することをサポートしており、それぞれが独自のブランチ、タグ、HEADを持ちます。Gitは各名前空間を独立したリポジトリとしてプルやプッシュの対象として公開できる一方、オブジェクトストアは共有され、すべての参照はgit-gc[1]のような操作に公開されます。

複数のリポジトリを単一リポジトリの名前空間として保存することで、同じソースの複数のブランチを保存する場合のように、同じオブジェクトの重複コピーを保存するのを回避します。オルタネート(alternates)メカニズムも重複を避けるための同様のサポートを提供しますが、オルタネートは継続的なメンテナンスなしにリポジトリに追加された新しいオブジェクト間の重複を防ぐことはできませんが、名前空間はそれが可能です。

名前空間を指定するには、`GIT_NAMESPACE`環境変数をその名前空間に設定します。各参照(ref)名前空間について、Gitは対応する参照を`refs/namespaces/`下のディレクトリに保存します。例えば、`GIT_NAMESPACE=foo`は参照を`refs/namespaces/foo/`下に保存します。git[1]の`--namespace`オプションを使って名前空間を指定することもできます。

`/`を含む名前空間は名前空間の階層に展開されることに注意してください。例えば、`GIT_NAMESPACE=foo/bar`は参照を`refs/namespaces/foo/refs/namespaces/bar/`下に保存します。これにより、`GIT_NAMESPACE`内のパスが階層的に動作し、`GIT_NAMESPACE=foo/bar`でクローンするのと、`GIT_NAMESPACE=foo`でクローンし、そのリポジトリから`GIT_NAMESPACE=bar`でクローンするのとで同じ結果が得られます。また、`foo/refs/heads/`のような奇妙な名前空間パスとの曖昧さも回避できます。そうでなければ、`refs`ディレクトリ内でディレクトリ/ファイル間の競合が発生する可能性があります。

git-upload-pack[1]git-receive-pack[1]は、`GIT_NAMESPACE`によって指定された参照(refs)の名前を書き換えます。git-upload-packとgit-receive-packは、指定された名前空間外のすべての参照を無視します。

スマートHTTPサーバーであるgit-http-backend[1]は、`GIT_NAMESPACE`をバックエンドプログラムに渡します。リポジトリの名前空間をリポジトリとして公開するための設定例については、git-http-backend[1]を参照してください。

簡単なローカルテストには、git-remote-ext[1]を使用できます。

git clone ext::'git --namespace=foo %s /tmp/prefixed.git'

セキュリティ

フェッチとプッシュのプロトコルは、共有を意図しないデータが相手のリポジトリから盗まれるのを防ぐようには設計されていません。悪意のあるピアから保護する必要があるプライベートデータがある場合、最適な選択肢は別のリポジトリに保存することです。これはクライアントとサーバーの両方に当てはまります。特に、サーバー上の名前空間は読み取りアクセス制御に効果的ではありません。リポジトリ全体への読み取りアクセスを信頼できるクライアントにのみ、名前空間への読み取りアクセスを許可するべきです。

既知の攻撃ベクトルは以下の通りです。

  1. 被害者は、明示的に共有を意図されていないが、ピアも持っている場合に転送を最適化するために使用できるオブジェクトのIDを宣伝する「have」行を送信します。攻撃者は盗むオブジェクトID Xを選択し、Xへの参照を送信しますが、被害者がすでに持っているためXの内容を送信する必要はありません。被害者は攻撃者がXを持っていると信じ、後でXの内容を攻撃者に送り返します。(この攻撃は、クライアントがアクセスできる名前空間にXへの参照を作成し、それをフェッチすることで、クライアントがサーバーに対して実行するのが最も簡単です。サーバーがクライアントに対して実行する最も可能性の高い方法は、Xを公開ブランチに「マージ」し、ユーザーがこのブランチで追加の作業を行い、マージに気づかずにサーバーにプッシュし直すことを期待することです。)

  2. 1と同様に、攻撃者は盗むオブジェクトID Xを選択します。被害者は攻撃者がすでに持っているオブジェクトYを送信し、攻撃者はXを持っていてYを持っていないと偽って主張するため、被害者はYをXに対するデルタとして送信します。このデルタは、XのうちYに似ている領域を攻撃者に明らかにします。

GIT

git[1]スイートの一部

scroll-to-top