2012-12-02 76 views

回答

3

A git fetch將從遠程存儲庫傳輸對象。爲了保持Git的完整性,只有完整的對象被寫入本地存儲庫。因此,如果提取被中斷,最終會得到部分對象,這意味着提取沒有完成,但沒有單個對象會被損壞。在隨後的訪存中,Git會再次計算出哪些對象丟失並獲取這些對象。

+0

這意味着在中斷之前傳輸的對象將不會再次傳輸。事實並非如此。 – qqx

+0

單個Git對象被傳輸時就是這種情況。另請參閱我對您的回答的評論。 – poke

1

當git fetch開始接收對象時,它會在存儲庫的 objects/pack目錄中創建一個臨時文件來容納新對象。只有一次 提取完成後,該臨時文件將被重命名爲將被其他git進程所認可的名稱,即 。如果提取被中斷,臨時的 文件將主要被忽略,包括通過另一次提取;因此在中斷之前傳輸的所有內容都將被再次傳輸。

及時(默認情況下爲2周),臨時包文件將有資格由垃圾回收進程移除 。您可以通過運行git gc --prune=now強制執行 。

+0

只有當提取獲取包對象時纔是如此。不是每個抓取都可以。當獲取正常的Git對象時,這些對象會直接移動到正確的文件夾中。 – poke

+0

@poke在我的測試中,即使我對服務器上的鬆散對象進行抓取,它們也會作爲一個包進行傳輸和接收。儘管如果使用愚蠢的服務器,這顯然會有所不同。 – qqx

+0

我通過Ctrl + C立即獲取並立即中斷測試。只有一些正常的Git對象文件被創建,沒有包文件。如果使用包文件可能取決於傳輸的數據量。 – poke

相關問題