Git 使用 zlib 壓縮文件的內容豪直。
Git 最初向磁盤中存儲對象時所使用的格式被稱為“松散(loose)”對象格式。 但是嗓蘑,Git 會時不時地將多個這些對象打包成一個稱為“包文件(packfile)”的二進制文件豌汇,以節(jié)省空間和提高效率。 當版本庫中有太多的松散對象柜思,或者你手動執(zhí)行 git gc 命令,或者你向遠程服務器執(zhí)行推送時陨享,Git 都會這樣做抛姑。 要看到打包過程定硝,你可以手動執(zhí)行 git gc 命令讓 Git 對對象進行打包:
$ git gc
Counting objects: 18, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (18/18), done.
Total 18 (delta 3), reused 0 (delta 0)
這個時候再查看 objects 目錄镀虐,你會發(fā)現(xiàn)大部分的對象都不見了空猜,與此同時出現(xiàn)了一對新文件:
$ find .git/objects -type f
.git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4
.git/objects/info/packs
.git/objects/pack/pack- 978e03944f5c581011e6998cd0e9e30000905586.idx
.git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.pack
仍保留著的幾個對象是未被任何提交記錄引用的數據對象。因為你從沒將它們添加至任何提交記錄中谆沃,所以 Git 認為它們是懸空(dangling)的,不會將它們打包進新生成的包文件中。
Git 打包對象時卓舵,會查找命名及大小相近的文件,并只保存文件不同版本之間的差異內容融击。 你可以查看包文件,觀察它是如何節(jié)省空間的封救。 git verify-pack 這個底層命令可以讓你查看已打包的內容
第二個版本完整保存了文件內容鹅士,而原始的版本反而是以差異方式保存的——這是因為大部分情況下需要快速訪問文件的最新版本以舒。
最妙之處是你可以隨時重新打包扼脐。 Git 時常會自動對倉庫進行重新打包以節(jié)省空間。當然你也可以隨時手動執(zhí)行 git gc 命令來這么做奋刽。