Git
英語 ▾ トピック ▾ 最新バージョン ▾ gitnamespaces 最終更新日:2.32.0

NAME

gitnamespaces - Git 名前空間

SYNOPSIS

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

DESCRIPTION

Git は、単一のレポジトリのリファレンスを複数の名前空間に分割することをサポートしています。各名前空間には、独自のブランチ、タグ、HEAD があります。Git は、オブジェクトストアを共有しながら、各名前空間を独立したレポジトリとして公開し、git-gc[1]などの操作ですべてのリファレンスを公開できます。

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

名前空間を指定するには、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へのリファレンスを作成し、それをフェッチすることで、クライアントがサーバーに対して実行するのが最も簡単です。サーバーがクライアントに対して実行する最も可能性の高い方法は、Xをパブリックブランチに「マージ」し、ユーザーがこのブランチで追加の作業を行い、マージに気づかずにサーバーにプッシュすることを期待することです。)

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

GIT

git[1] スイートの一部

scroll-to-top