Git
English ▾ 主題 ▾ 最新版本 ▾ 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. 受害者傳送「have」行,聲稱其擁有的物件 ID 不是明確打算共享,但如果對等方也有這些物件,則可用於最佳化傳輸。攻擊者選擇要竊取的物件 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