?
本文檔使用 php中文網手冊 發(fā)布
gitnamespaces - Git 命名空間
GIT_NAMESPACE=<namespace> git upload-pack GIT_NAMESPACE=<namespace> git receive-pack
Git 支持將單個存儲庫的引用劃分為多個名稱空間,每個名稱空間都有自己的分支,標簽和 HEAD 。Git 可以將每個名稱空間公開為一個獨立的存儲庫,以便在共享對象存儲的同時從其中抽取和推送,并將所有參考文獻公開給 git-gc [1] 等操作。
將多個存儲庫作為單個存儲庫的名稱空間存儲可避免存儲相同對象的重復副本,例如存儲同一個源的多個分支時。alternates 機制提供了類似的支持以避免重復,但是替代方法并不能防止添加到存儲庫的新對象之間的重復,而無需進行持續(xù)維護,而名稱空間則可以。
要指定名稱空間,請將GIT_NAMESPACE
環(huán)境變量設置為名稱空間。對于每個 ref 命名空間,Git 將相應的 ref 存儲在一個目錄下refs/namespaces/
。例如,GIT_NAMESPACE=foo
將存儲參考下refs/namespaces/foo/
。你也可以通過--namespace
git [1] 選項指定命名空間。
請注意,包含/
的命名空間將擴展到命名空間的層次結構; 例如,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] 按照指定的方式重寫 refs 的名字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'
獲取和推送協(xié)議并不旨在防止一方從另一個不想共享的存儲庫中竊取數據。如果您需要保護私密數據免受惡意對等攻擊,則最佳選擇是將其存儲在另一個存儲庫中。這適用于客戶端和服務器。特別是,服務器上的名稱空間對讀取訪問控制無效; 您應該只向授予讀取權限的客戶端授予對整個存儲庫的讀取訪問權限。
已知的攻擊媒介如下:
1. victim 發(fā)送 “have” 線廣告其具有的對象的 ID,這些對象的 ID 沒有明確地意圖共享,但是如果對等方也擁有它們,則可用于優(yōu)化傳送。攻擊者選擇一個對象 ID X 來竊取并向X發(fā)送一個 ref,但不需要發(fā)送 X 的內容,因為受害者已經擁有了它。現在受害者認為攻擊者擁有 X ,并且稍后將X的內容發(fā)送回攻擊者。(這種攻擊對于客戶端來說在服務器上執(zhí)行起來是最直接的,通過在客戶端有權訪問的命名空間中創(chuàng)建對 X 的引用,然后獲取它,服務器在客戶端上執(zhí)行它的最可能方式是“合并“ X 到一個公共分支,并希望用戶在這個分支上做額外的工作,并將其推回服務器而不會注意到合并。)
2. 和#1一樣,攻擊者選擇一個對象 ID X 來竊取。被攻擊者發(fā)送給攻擊者已經擁有的對象 Y,并且攻擊者錯誤地聲稱具有 X 而不是 Y ,所以被攻擊者發(fā)送 Y 作為與 X 相對的三角點。該三角點揭示 X 與攻擊者類似的 X 的區(qū)域。