設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.32.1 → 2.52.0 無更改
-
2.32.0
2021-06-06
- 2.12.5 → 2.31.8 無更改
-
2.11.4
2017-09-22
- 2.1.4 → 2.10.5 無更改
-
2.0.5
2014-12-17
描述
Git 支援將單個倉庫的引用(refs)劃分為多個名稱空間,每個名稱空間都有自己的分支、標籤和 HEAD。Git 可以將每個名稱空間作為獨立的倉庫暴露出來進行拉取(pull)和推送(push),同時共享物件儲存,並向 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'
安全性
fetch 和 push 協議並非設計用於防止一方竊取另一方倉庫中未打算共享的資料。如果您有需要保護免受惡意對等方侵害的私有資料,您的最佳選擇是將其儲存在另一個倉庫中。這適用於客戶端和伺服器。特別地,伺服器上的名稱空間對於讀取訪問控制無效;您應該只授予您信任的客戶端對整個倉庫的讀取訪問許可權的名稱空間讀取訪問許可權。
已知的攻擊向量如下:
-
受害者傳送“have”行,廣告它擁有但未明確打算共享的物件 ID,這些物件 ID 可用於最佳化傳輸,前提是對方也擁有它們。攻擊者選擇一個物件 ID X 來竊取併發送一個指向 X 的 ref,但不需要傳送 X 的內容,因為受害者已經擁有它。現在受害者認為攻擊者擁有 X,並且之後會將 X 的內容傳送回攻擊者。(此攻擊最容易由客戶端對伺服器執行,透過在客戶端有權訪問的名稱空間中建立指向 X 的 ref,然後獲取它。伺服器對客戶端執行此操作的最可能方式是“合併”X 到一個公共分支,並希望使用者在此分支上進行更多工作並將其推回伺服器,而不會注意到合併。)
-
與 #1 類似,攻擊者選擇一個物件 ID X 來竊取。受害者傳送一個攻擊者已擁有的物件 Y,攻擊者謊稱擁有 X 而不是 Y,因此受害者將 Y 作為 X 的增量傳送。增量向攻擊者揭示了 X 中與 Y 相似的區域。