SYNOPSIS

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

DESCRIPTION

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

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

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

注意: / を含む名前空間は、名前空間の階層に拡張されることに注意してください。たとえば、 GIT_NAMESPACE=foo/bar はrefを 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 で指定されているようにrefの名前を書き換えます。 git-upload-pack と git-receive-pack は、指定された名前空間外のすべてのrefを無視します。

スマート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'

SECURITY

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

既知の攻撃ベクトル(attack vectors)は以下のとおりです:

  1. 被害者は、明示的に共有することを意図していないオブジェクトのIDをアドバタイズする "have" 行を送信しますが、他にもIDを持っている者が居る場合は、転送を最適化するために使用できます。攻撃者はオブジェクトID Xを選択して盗み、refをXに送信しますが、被害者はすでにXのコンテンツを持っているため、Xのコンテンツを送信する必要はありません。 これで、被害者は攻撃者がXを持っていると信じ、Xのコンテンツを後で攻撃者に送り返します。 (この攻撃は、クライアントがアクセスできる名前空間にXへのrefを作成してフェッチすることにより、クライアントがサーバー上で実行するのが最も簡単です。サーバーがクライアント上で実行する最も可能性の高い方法は、Xをパブリックブランチにマージし、ユーザーがこのブランチで追加の作業を行い、マージに気付かずにサーバーにプッシュバックすることを期待します。)

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

GIT

Part of the git(1) suite