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

名前

gitnamespaces - Git 名前空間

概要

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

説明

Gitは、単一リポジトリの参照を複数の名前空間に分割することをサポートしており、各名前空間には独自のブランチ、タグ、およびHEADがあります。Gitは各名前空間を独立したリポジトリとして公開し、そこからプルおよびプッシュできます。同時にオブジェクトストアを共有し、git-gc[1]などの操作にすべての参照を公開します。

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

名前空間を指定するには、GIT_NAMESPACE 環境変数を名前空間に設定します。各参照名前空間について、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 で指定された参照の名前を書き換えます。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に対するデルタとして送信します。デルタは、Yに似ているXの領域を攻撃者に明らかにします。

GIT

git[1]スイートの一部

scroll-to-top