簡體   English   中英

如何從淺克隆中有效地 git fetch

[英]How to git fetch efficiently from a shallow clone

我們使用git 分發操作系統並使其保持最新 我們無法分發完整的存儲庫,因為它太大(> 2GB),所以我們一直在使用淺克隆(~300M)。 然而,最近從淺克隆中獲取時,它現在獲取整個 >2GB 存儲庫的效率低下 這對於部署來說是一種站不住腳的帶寬浪費。

git 文檔說你不能從一個淺存儲庫中獲取,盡管這完全不是真的。 是否有任何解決方法可以使git clone --depth 1能夠從中獲取更改的內容? 或者其他一些策略來保持分布大小盡可能小,同時讓 git 需要進行更新的所有位?

我嘗試從--depth 20克隆以查看它是否會更有效地升級,但沒有成功,但沒有成功。 我也查看了http://git-scm.com/docs/git-bundle ,但這似乎創建了巨大的包。

--depth是一個git fetch選項。 我看到文檔並沒有真正強調git clone進行提取。

當您獲取時,兩個存儲庫交換關於誰擁有什么的信息,方法是從遠程的頭部開始並向后搜索獲取的引用歷史記錄中的最新共享提交,然后填充所有丟失的對象以僅完成兩個對象之間的新提交最近共享的提交和新獲取的提交。

A --depth=1 fetch 只獲取分支提示,沒有先前的歷史記錄。 進一步獲取這些歷史記錄將通過上述過程獲取所有新內容,但如果先前獲取的提交不在新獲取的歷史記錄中,則 fetch 將檢索所有這些 - 除非您使用--depth限制獲取。

您的客戶從一個 repo 中執行了 depth=1 fetch 並將 url 切換到另一個 repo。 在這個新的 repo 的 refs 中,至少有一個很長的祖先路徑顯然與你的 repo 中當前的任何內容都沒有共享。 這可能值得研究,但無論哪種方式,除非有某些特殊原因,否則您的客戶可以只執行每次 fetch --depth=1

剛剛做了g clone github.com:torvalds/linux並且花了很多時間,所以我只是通過CTRL+C跳過它。

然后做了g clone github.com:torvalds/linux --depth 1並且它確實克隆得非常快。 我在git log只有一次提交。

所以clone --depth 1應該可以工作。 如果您需要更新現有存儲庫,您應該使用git fetch origin remoteBranch:localBranch --depth 1 它也有效,它只獲取一次提交。

總結:

初始克隆:

git clone git_url --depth 1

代碼更新

git fetch origin remoteBranch:localBranch --depth 1

請注意,Git 1.9/2.0(2014 年第一季度)在獲取淺克隆時可能更有效。
請參閱來自Nguyễn Thái Ngọc Duy ( pclouds ) 的提交 82fba2b

現在 git 支持從淺層克隆或向淺層克隆傳輸數據,這些限制不再成立。

所有細節都在“ shallow.c :為.git/shallow選擇新提交的 8 個步驟”中。

您可以在諸如0d7d285f2c681cc29a7b8 之類的提交中看到結果,這些提交支持克隆、使用/來自淺層克隆的 send-pack /receive-pack。
smart-http 現在也支持淺取/克隆
甚至可以克隆形成一個淺的 repo

2015 年更新:git 2.5+(2015 年第二季度)甚至允許單次提交獲取 請參閱“從遠程 git 存儲庫中提取特定提交”。

2016 年更新(10 月):git 2.11+(2016 年第四季度)允許獲取:

如果你可以選擇一個特定的分支,它會更快。 這是一個使用 Spark master 分支和 latest 標簽的示例:

初始克隆

git clone git@github.com:apache/spark.git --branch master --single-branch --depth 1

更新到特定標簽

git fetch --depth 1 origin tags/v1.6.0

以這種方式切換標簽/分支變得非常快。

我不知道它是否適合您的設置,但我使用的是在單獨的目錄中擁有完整的 repo 克隆。 然后我從遠程存儲庫參考本地存儲庫進行淺克隆。

git clone --depth 1 --reference /path/to/local/clone git@some.com/group/repo.git 

這樣,實際上只獲取了與參考存儲庫和遠程存儲庫之間的差異。 為了讓它更快,您可以使用--shared選項,但請務必閱讀git文檔中的限制(這可能很危險)。

我還發現,在某些情況下,當遙控器發生很大變化時,克隆開始獲取太多數據。 然后打破它並更新參考存儲庫(奇怪的是,它占用的帶寬比一開始要少得多。)然后再次啟動克隆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM