SYNOPSIS
GIT_NAMESPACE=<namespace> 'git upload-pack'
GIT_NAMESPACE=<namespace> 'git receive-pack'
DESCRIPTION
Git は、単一のリポジトリーの参照を複数の名前空間に分割することをサポートしています。 各名前空間には、 独自のブランチやタグや HEAD があります。 Git は、 オブジェクト・ストアを共有し、 すべての参照を git-gc(1) などの操作に公開しながら、 プル元とプッシュ先が独立したリポジトリーとして各名前空間を公開できます。
複数のリポジトリーを単一のリポジトリーの名前空間として保存すると、同じソースの複数のブランチを保存する場合など、同じオブジェクトの重複コピーを保存することを回避できます。代替メカニズム(alternates mechanism)は、重複を回避するための同様のサポートを提供しますが、名前空間が行うのに対し、代替は、継続的なメンテナンスなしでリポジトリーに追加された新しいオブジェクト間の重複を防止しません。
名前空間を指定するには、 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'
SECURITY
フェッチ・プロトコルやプッシュ・プロトコルは、 共有することを意図していない一方の側が他方のリポジトリからデータを盗むのを防ぐようには設計されていません。悪意のある者から保護する必要のあるプライベートデータがある場合、最善のオプションはそれを別のリポジトリに保存することです。これは、クライアントとサーバーの両方に適用されます。特に、サーバー上の名前空間は、読み取りアクセス制御には効果的ではありません。リポジトリ全体への読み取りアクセスで信頼できるクライアントにのみ、名前空間への読み取りアクセスを許可する必要があります。
既知の攻撃ベクトル(attack vectors)は以下のとおりです:
-
被害者は
have
行を送信して、 所有しているオブジェクトのIDを広告(advertise)します。 これらのIDは明示的に共有されることを意図していませんが、 相手(peer)もそれを持っている場合に転送を最適化するために使用できます。 攻撃者は盗むオブジェクトID Xを選択して、 X への ref 送信しますが、 被害者はすでにXのコンテンツを持っているため、 Xのコンテンツを送信する必要はありません。 これで、 被害者は攻撃者がXを持っていると信じ、 X のコンテンツを後で攻撃者に送り返します。 (この攻撃は、クライアントがアクセスできる名前空間に X への ref を作成してフェッチすることにより、 クライアントがサーバー上で実行するのが最も簡単です。 サーバーがクライアント上で実行する最も可能性の高い方法は、 X をパブリック・ブランチにマージし、ユーザーがこのブランチで追加の作業を行い、マージに気付かずにサーバーにプッシュバックすることを期待します。) -
#1 と同様に、攻撃者は盗むオブジェクトID Xを選択します。被害者は、攻撃者がすでに持っているオブジェクトYを送信し、攻撃者はYではなくXを持っていると誤って主張するため、被害者はYをXに対するデルタとして送信します。デルタは、攻撃者にYに類似したXの領域を明らかにします。
GIT
Part of the git(1) suite