簡體   English   中英

git“淺層克隆+非淺層”與“正常克隆”

[英]git "shallow clone + unshallow" vs "normal clone"

我已經看到了 git 克隆錯誤的答案,建議不要克隆整個 repo,而只克隆最新的提交,然后使用 unshallow 來獲取提交的 rest。

考慮以下兩個命令

1. 
git clone <url> --depth 1
git fetch --unshallow

2. 
git clone <url>

克隆的最終 output 是否相同? 如果是這樣,對於一個非常大的 repo,第二個命令如何比第一個命令工作得快得多?

還有其他一些淺克隆沒有做的事情,或者有一些缺點,特別是在使用大型存儲庫時?

當您克隆一個非常大的存儲庫時,您需要傳輸大量數據。 根據您的網絡速度,這可能需要很長時間。 舉幾個具體的數字,讓我們使用 10 GiB 作為整個存儲庫數據傳輸大小(數據傳輸大小和磁盤大小會有所不同,盡管通常差別不大)並假設您可以獲得1 兆字節/秒。 這意味着數據傳輸需要 10240 MiB / (1 MiB/s) = 10240 s = 170.667 分鍾 = 不到 3 小時(大約 2 小時 50 分鍾)。

使用的各種協議都內置了錯誤檢測和(通常在硬件級別)糾正,但在此期間連接仍有可能失敗。 如果連接失敗, git clone將整個事情視為原子:沒有任何工作,因此 Git 將刪除整個克隆。

如果使用--depth 1獲取導致初始克隆僅復制大約 1/3 的整體數據,我們將克隆時間減少到大約 1 小時,從而降低了完全失敗的風險。 然后可以逐步添加到淺克隆(使用--deepen或更大的--depth數字到git fetch )。 每一個都有失敗的風險,但失敗只會導致不添加任何對象:現有的克隆沒有受到傷害。 根據需要重試一個小時的傳輸比重新啟動整個 3 小時的傳輸只是讓它在 2 小時 20 分鍾內失敗。1

最終,最后的--unshallow會得到你應該得到的一切,如果你能夠一次完成一個完整的克隆而沒有錯誤的話。 請注意,您可能希望在初始淺克隆期間使用--no-single-branch ,或者在初始淺克隆之后修復 fetch refspec。

克隆的最終 output 是否相同?

這個問題的答案既不是也不是。 我們需要准確地定義“最終輸出”的含義。 但是,就對所有提交和其他對象的有用訪問而言,結果是相同的(前提是您撤消了--depth參數的單分支效果)。

如果是這樣,對於一個非常大的 repo,第二個命令如何比第一個命令工作得快得多?

它不一定工作得更快。 但是,在進行完整克隆時,Git 可以——不一定可以,但可以——只發送現有的包文件,而不是構建新的包文件。 這可以節省發送端的 CPU 時間。 如果發送方上的(單個)包文件結構良好,則接收方上生成的單個包文件也結構良好。 用一個淺層克隆,甚至一個單一的非淺層重復加深的結果,通常會在接收器上出現多個包文件; 這些可能沒有那么好構建。


1我是根據這里的實際經驗說話的。 :-) 現在的傳輸速率比 2005 年通過片狀 DSL 布線更高,但存儲庫現在也更大了。 而且,即使是現在,美國在某些地方的互聯網基礎設施也很糟糕。

暫無
暫無

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

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