Git的gc功能


Git的底層並沒有采用 CVS、SVN 底層所采用的那套增量式文件系統,而是采用一套自行維護的存儲文件系統。當文件變動發生提交時,該文件系統存儲的不是文件的差異信息,而是文件快照,即整個文件內容,並保存指向快照的索引。這種做法,提高 Git 分支的使用效率;但也容易導致代碼倉庫中內容重復程度過高,從而倉庫體積過大。當遇到這種情況時,或者需要將倉庫推送到遠程主機時,就需要Git中的gc(garbage collect)功能,也就是垃圾回收功能。

大體來說,當運行 "git gc" 命令時,Git會收集所有松散對象並將它們存入 packfile,合並這些 packfile 進一個大的 packfile,然后將不被任何 commit 引用並且已存在一段時間 (數月) 的對象刪除。 此外,Git還會將所有引用 (references) 並入一個單獨文件。

就細節而言,Git做了這幾件事:

    pack_refs 過程
    reflog expire 過程
    repack 過程
    prune 過程
    rerere 過程

pack_refs 過程相當於執行"git pack-refs --all --prune",它會將$GIT_DIR/refs目錄下的所有heads和tags打包成一個文件並保存為$GIT_DIR/packed-refs下。

reflog expire 過程相當於執行"git reflog expire --all",它會將刪除所有超過期限而且沒有被refs涉及的reflog條目。

repack 過程相當於執行"git repack -d -l",一般情況下還會包括"-A"選項,它會將所有未被包含在一個pack的松散對象連結成一個pack,也會將現有的pack重新組織為一個新的更有效率的pack,並刪除冗余的pack(如果她們中存在不可達的松散對象,會先把這些對象釋放出來)。

prune 過程相當於執行"git prune --expire",他會刪除所有過期的、不可達的且未被打包的松散對象。

rerere 過程相當於執行"git rerere gc",這種情形下似乎沒什么用。
————————————————
版權聲明:本文為CSDN博主「lihuanshuai」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lihuanshuai/java/article/details/37345565


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM