1. 程式人生 > >深入理解Git (六)

深入理解Git (六)

Git在儲存資料的時候,儲存的都是完整的物件,並不是差異,叫做鬆散物件Loose Object,有時候你只改變了一點,但是同時會擁有近乎兩倍大小的blob物件。

這樣子做豈不是很不節省磁碟?所以Git會在每次push到遠端的時候進行garbage collect操作,當然我們也可以自己手動改進行gc,如:

git gc

Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 0), reused 0 (delta 0)

然後檢視一下.git/objects下有哪些檔案:

find .git/objects -type f

發現多了一些pack檔案:

.git/objects/info/packs
.git/objects/pack/pack-abcde.idx
.git/objects/pack/pack-abcde.pack

當然也還有可能還有一些dangling的物件,這些物件是沒有被其它引用的物件,git不會對其進行pack。.pack檔案儲存了所有刪除的物件, .idx檔案是索引檔案,儲存相應的偏移資訊。

我們可以使用verify-pack命令顯示pack的資訊:

git verify-pack -v .git/objects/pack/pack-abcde.idx

a35a7ea3f7b55be91743c708d150b573116515ec commit 239 160 12
fb1c75a143de21f30004dab829b39f99d225d292 commit 187 128 172
ca2b7d42454d33b31cfc810592e8bd47f811decd tree   70 76 300
fd5d73ef7deb282cbf47826c58448597f24453ba blob   18 28 376
56166dc42a6a2f694e088694a2a2c90606e28f2d blob   16 23 404
4e1ba2916b4b903d2e5a2209cdcca7129a891c2f tree   36 46 427
non delta: 6 objects
objects/pack/pack-83c7f603b25c063accec33ee8869a6afb1e9fd0a.pack: ok

第一列顯示物件的指標,即Hash值,第二列展示是什麼型別的物件,第三列展示佔用了多少位元組。

作者:hongchangfirst