git向磁盤中存儲對象使用“松散(loose)”對象格式。比如文件a.txt第一個版本大小是10k,第二個版本向其中添加了一行代碼,假如此時文件為10.1k,那么第二個版本會重新產生一個1.1k的文件,這樣會很浪費磁盤空間,所以git會時不時地將多個這些對象打包成一個稱為“包文件(packfile)”的二進制文件,以節省空間和提高效率。在手動執行git gc的時候,或者向遠程推送的時候,都會進行打包的操作。
$ git gc
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), done.
Total 4 (delta 0), reused 0 (delta 0)
$ find .git/objects/ -type f
.git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4
.git/objects/info/packs
.git/objects/pack/pack-5e00a7e5254491edada3599d9091d49afb16c975.idx
.git/objects/pack/pack-5e00a7e5254491edada3599d9091d49afb16c975.pack
執行git gc會主動出發git的打包機制,打包以后,會在 .git/objects/pack文件夾中產生兩個文件,其他的文件都是在此次打包過程中,git認為不能是搖擺的文件,一般是沒有被添加到任何提交記錄中的文件。
.pack 是包文件,這個文件包含了從文件系統中移除的所有對象的內容
.idx是索引文件,這個文件包含了包文件的偏移信息
備注:
1.可以通過git verify-pack命令來查看包文件,但是我不會。。。。
2.在打包以后,git會在第二個版本中存儲完整的文件,而在第一個版本中存便宜,這樣做的目的是,git認為檢出第二個版本的概率要大於檢出第一個版本的概率
查看git中各種文件的大小:
$ git count-objects -v
count: 0
size: 0
in-pack: 15
packs: 1
size-pack: 8
prune-packable: 0
garbage: 0
size-garbage: 0