精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文講透 Git 底層數(shù)據(jù)結(jié)構(gòu)和原理

開(kāi)發(fā) 開(kāi)發(fā)工具
本文將系統(tǒng)分享 Git 底層知識(shí):對(duì)象生命周期變化,底層數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)包文件結(jié)構(gòu),數(shù)據(jù)包文件索引,以及詳細(xì)分析對(duì)象查詢(xún)流程和算法。

本文將系統(tǒng)分享 Git 底層知識(shí):對(duì)象生命周期變化,底層數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)包文件結(jié)構(gòu),數(shù)據(jù)包文件索引,以及詳細(xì)分析對(duì)象查詢(xún)流程和算法。

狀態(tài)模型

??

??

 

上圖描述了 git 對(duì)象的在不同的生命周期中不同的存儲(chǔ)位置,通過(guò)不同的 git 命令改變 git 對(duì)象的存儲(chǔ)生命周期。

工作區(qū) (workspace)

就是我們當(dāng)前工作空間,也就是我們當(dāng)前能在本地文件夾下面看到的文件結(jié)構(gòu)。初始化工作空間或者工作空間 clean 的時(shí)候,文件內(nèi)容和 index 暫存區(qū)是一致的,隨著修改,工作區(qū)文件在沒(méi)有 add 到暫存區(qū)時(shí)候,工作區(qū)將和暫存區(qū)是不一致的。

暫存區(qū) (index)

老版本概念也叫 Cache 區(qū),就是文件暫時(shí)存放的地方,所有暫時(shí)存放在暫存區(qū)中的文件將隨著一個(gè) commit 一起提交到 local repository 此時(shí) local repository 里面文件將完全被暫存區(qū)所取代。暫存區(qū)是 git 架構(gòu)設(shè)計(jì)中非常重要和難理解的一部分。

本地倉(cāng)庫(kù) (local repository)

git 是分布式版本控制系統(tǒng),和其他版本控制系統(tǒng)不同的是他可以完全去中心化工作,你可以不用和中央服務(wù)器 (remote server) 進(jìn)行通信,在本地即可進(jìn)行全部離線(xiàn)操作,包括 log,history,commit,diff 等等。完成離線(xiàn)操作最核心是因?yàn)?git 有一個(gè)幾乎和遠(yuǎn)程一樣的本地倉(cāng)庫(kù),所有本地離線(xiàn)操作都可以在本地完成,等需要的時(shí)候再和遠(yuǎn)程服務(wù)進(jìn)行交互。

遠(yuǎn)程倉(cāng)庫(kù) (remote repository)

中心化倉(cāng)庫(kù),所有人共享,本地倉(cāng)庫(kù)會(huì)需要和遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行交互,也就能將其他所有人內(nèi)容更新到本地倉(cāng)庫(kù)把自己內(nèi)容上傳分享給其他人。結(jié)構(gòu)大體和本地倉(cāng)庫(kù)一樣。

文件在不同的操作下可能處于不同的 git 生命周期,下面看看一個(gè)文件變化的例子。

文件變化

??

??

 

對(duì)象模型

倉(cāng)庫(kù)結(jié)構(gòu)

git 分布式的一個(gè)重要體現(xiàn)是 git 在本地是有一個(gè)完整的 git 倉(cāng)庫(kù)也就是 .git 文件目錄,通過(guò)這個(gè)倉(cāng)庫(kù),git 就可以完全離線(xiàn)化操作。在這個(gè)本地化的倉(cāng)庫(kù)中存儲(chǔ)了 git 所有的模型對(duì)象。下面是 git 倉(cāng)庫(kù)的 tree 和相關(guān)說(shuō)明:

??

??

 

git 主要有四個(gè)對(duì)象,分別是 Blob,Tree, Commit, Tag 他們都用 SHA-1 進(jìn)行命名。

你可以用 git cat-file -t 查看每個(gè) SHA-1 的類(lèi)型,用 git cat-file -p 查看每個(gè)對(duì)象的內(nèi)容和簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。git cat-file 是 git 的瑞士軍刀,是底層核心命令。

Blob 對(duì)象

只用于存儲(chǔ)單個(gè)文件內(nèi)容,一般都是二進(jìn)制的數(shù)據(jù)文件,不包含任何其他文件信息,比如不包含文件名和其他元數(shù)據(jù)。

Tree 對(duì)象

對(duì)應(yīng)文件系統(tǒng)的目錄結(jié)構(gòu),里面主要有:子目錄 (tree),文件列表 (blob),文件類(lèi)型以及一些數(shù)據(jù)文件權(quán)限模型等。

如下圖輸出:

→ git cat-file -t ed807a4d010a06ca83d448bc74c6cc79121c07c3 
tree
→ git cat-file -p ed807a4d010a06ca83d448bc74c6cc79121c07c3
100644 blob 36a982c504eb92330573aa901c7482f7e7c9d2e6 .cise.yml
100644 blob c439a8da9e9cca4e7b29ee260aea008964a00e9a .eslintignore
100644 blob 245b35b9162bec4ef798eb05b533e6c98633af5c .eslintrc
100644 blob 10123778ec5206edcd6e8500cc78b77e79285f6d .gitignore
100644 blob 1a48aa945106d7591b6342585b1c29998e486bf6 README.md
100644 blob 514f7cb2645f44dd9b66a87f869d42902174fe40 abc.json
040000 tree 8955f46834e3e35d74766639d740af922dcaccd3 cli_list100644 blob f7758d0600f6b9951cf67f75cf0e2fabcea55771 dep.json
040000 tree e2b3ee59f6b030a45c0bf2770e6b0c1fa5f1d8c7 doc
100644 blob e3c712d7073957c3376d182aeff5b96f28a37098 index.js
040000 tree b4aadab8fc0228a14060321e3f89af50ba5817ca lib040000 tree 249eafef27d9d8ebe966e35f96b3092d77485a79 mock
100644 blob 95913ff73be1cc7dec869485e80072b6abdd7be4 package.json
040000 tree e21682d1ebd4fdd21663ba062c5bfae0308acb64 src
040000 tree 91612a9fa0cea4680228bfb582ed02591ce03ef2 static
040000 tree d0265f130d2c5cb023fe16c990ecd56d1a07b78c task100644 blob ab04ef3bda0e311fc33c0cbc8977dcff898f4594 webpack.config.js
100644 blob fb8e6d3a39baf6e339e235de1a9ed7c3f1521d55 webpack.dll.config.js
040000 tree 5dd44553be0d7e528b8667ac3c027ddc0909ef36 webpack

詳細(xì)解釋如下:

??

??

 

Commit 對(duì)象

是一次修改的集合,當(dāng)前所有修改的文件的一個(gè)集合,可以類(lèi)比一批操作的“事務(wù)”。是修改過(guò)的文件集的一個(gè)快照,隨著一次 commit 操作,修改過(guò)的文件將會(huì)被提交到 local repository 中。通過(guò) commit 對(duì)象,在版本化中可以檢索出每次修改內(nèi)容,是版本化的基石。

→ git cat-file -t fbf9e415f77008b780b40805a9bb996b37a6ad2c 
commit
→ git cat-file -p fbf9e415f77008b780b40805a9bb996b37a6ad2c
tree bd31831c26409eac7a79609592919e9dcd1a76f2
parent d62cf8ef977082319d8d8a0cf5150dfa1573c2b7
author xxx 1502331401 +0800
committer xxx 1502331401 +0800
修復(fù)增量bug

詳細(xì)解釋如下:

??

??

 

Tag 對(duì)象

tag 是一個(gè)"固化的分支",一旦打上 tag 之后,這個(gè) tag 代表的內(nèi)容將永遠(yuǎn)不可變,因?yàn)?tag 只會(huì)關(guān)聯(lián)當(dāng)時(shí)版本庫(kù)中最后一個(gè) commit 對(duì)象。

分支的話(huà),隨著不斷的提交,內(nèi)容會(huì)不斷的改變,因?yàn)榉种е赶虻淖詈笠粋€(gè) commit 不斷改變。所以一般應(yīng)用或者軟件版本的發(fā)布一般用 tag。

git 的 Tag 類(lèi)型有兩種:

1 lightweight (輕量級(jí))

創(chuàng)建方式:

git tag tagName

這種方式創(chuàng)建的 Tag,git 底層不會(huì)創(chuàng)建一個(gè)真正意義上的 tag 對(duì)象,而是直接指向一個(gè) commit 對(duì)象,此時(shí)如果使用 git cat-file -t tagName 會(huì)返回一個(gè) commit。

→ git cat-file -t v4 
commit
→ git cat-file -p v4
tree ceab4f96440655b0ff1a783316c95450fa1fb436
parent 7f23c9ca70ce64fc58e8c7507c990c6c6a201d3d
author 與水 1506224164 +0800
committer 與水 1506224164 +0800

rawtest2

2 annotated (含附注)

創(chuàng)建方式:

git tag -a tagName -m''

這種方式創(chuàng)建的標(biāo)簽,git 底層會(huì)創(chuàng)建一個(gè) tag 對(duì)象,tag 對(duì)象會(huì)包含相關(guān)的 commit 信息和 tagger 等額外信息,此時(shí)如果使用 git cat-file -t tagname 會(huì)返回一個(gè) tag。

→ git cat-file -t v3 
tag
→ git cat-file -p v3
object d5d55a49c337d36e16dd4b05bfca3816d8bf6de8 //commit 對(duì)象SHA-1
type commit
tag v3
tagger xxx 1506230900 +0800

??c4c24b6afd78e931.jpg" target="_blank">c4c24b6afd78e931.jpg" width="auto" border="0" height="auto" alt="" title="">??

 

總結(jié):所有對(duì)象模型之間的關(guān)系大致如下:

??

??

 

存儲(chǔ)模型

概念

git 區(qū)別與其他 vcs 系統(tǒng)的一個(gè)最主要原因之一是:git 對(duì)文件版本管理和其他 vcs 系統(tǒng)對(duì)文件版本的實(shí)現(xiàn)理念完成不一樣。這也就是 git 版本管理為什么如此強(qiáng)大的最核心的地方。

Svn 等其他的 VCS 對(duì)文件版本的理念是以文件為水平維度,記錄每個(gè)文件在每個(gè)版本下的 delta 改變。

Git 對(duì)文件版本的管理理念卻是以每次提交為一次快照,提交時(shí)對(duì)所有文件做一次全量快照,然后存儲(chǔ)快照引用。

Git 在存儲(chǔ)層,如果文件數(shù)據(jù)沒(méi)有改變的文件,Git 只是存儲(chǔ)指向源文件的一個(gè)引用,并不會(huì)直接多次存儲(chǔ)文件,這一點(diǎn)可以在 pack 文件中看見(jiàn)。

如下圖所示:

??

??

 

存儲(chǔ)

隨著需求和功能的不斷復(fù)雜,git 版本的不斷更新,但是主要的存儲(chǔ)模型還是大致不變。如下圖所示:

??

??

檢索模型

→ cd .git/objects/ 
→ ls
03 28 7f ce d0 d5 e6 f9 info pack

git 的對(duì)象有兩種:

一種是松散對(duì)象,就是在如上 .git/objects 的文件夾 03 28 7f ce d0 d5 e6 f9 等,這些文件夾只有 2 個(gè)字符開(kāi)頭,其實(shí)就是每個(gè)文件 SHA-1 值的前 2 個(gè)字母,最多有 #OXFF 256 個(gè)文件夾。

一種是打包壓縮對(duì)象,打包壓縮之后的對(duì)象主要存在的是 pack 文件中,主要用于文件在網(wǎng)絡(luò)上傳輸,減少網(wǎng)絡(luò)消耗。

為了節(jié)省存儲(chǔ)空間,可以手動(dòng)觸發(fā)打包壓縮操作 (git gc),將松散對(duì)象打包成 pack 文件對(duì)象。也可以將 pack 文件解壓縮成松散對(duì)象 (git unpack-objects)

→ cd pack 
→ ls
pack-efbf3149604d24e6ea427b025da0c59245b2c2ea.idx pack-efbf3149604d24e6ea427b025da0c59245b2c2ea.pack

為了加快 pack 文件的檢索效率,git 基于 pack 文件會(huì)生成相應(yīng)的索引 idx 文件。

pack 文件

pack 文件設(shè)計(jì)非常精密和巧妙,本著降低文件大小,減少文件傳輸,降低網(wǎng)絡(luò)開(kāi)銷(xiāo)和安全傳輸?shù)脑瓌t設(shè)計(jì)的。

pack 文件設(shè)計(jì)的概圖如下:

??

??

 

pack 文件主要有三部分組成,Header, Body, Trailer

  • Header 部分主要 4-byte "PACK", 4-byte "版本號(hào)", 4-byte "Object 條目數(shù)"。
  • Body 部分主要是一個(gè)個(gè) Git 對(duì)象依次存儲(chǔ),存儲(chǔ)位置在 idx 索引文件中記錄改對(duì)象在 pack 文件中的偏移量 offset。
  • Trailer 部分主要是所有 Objects 的名 (SHA-1)的校驗(yàn)和,為了安全可靠的文件傳輸。

下面我們看具體的 pack 文件:

??

??

 

從上圖可知:通過(guò) idx 索引文件在 pack 文件中定位到對(duì)象之后,對(duì)象的結(jié)構(gòu)主要 Header 和 Data 兩部分。

1 Header 部分

??5ad2f979e6c43.jpg" target="_blank">5ad2f979e6c43.jpg" width="auto" border="0" height="auto" alt="" title="">??

 

Header 中首 8-bits:1-bit 是 MSB,接著的 3-bits 表示的是當(dāng)前對(duì)象類(lèi)型,主要有 6種存儲(chǔ)類(lèi)型,接著的 4-bits 是用于表示該 Object 展開(kāi)的 (length) 大小的一部分,只是一部分,完整的大小取決于MSB和接下來(lái)的多個(gè) bits,完整算法如下:

  • 如果 8-bits 中第一位是 1,表示下一個(gè)字節(jié)還是 header 的一部分,用于表示該對(duì)象展開(kāi)的大小。
  • 如果 8-bits 中第一位是 0,表示從下一個(gè)字節(jié)開(kāi)始,將是數(shù)據(jù) Data 文件。
  • 如果對(duì)象類(lèi)型是 OBJ_OFS_DELTA 類(lèi)型, 表示的是 Delta 存儲(chǔ),當(dāng)前 git 對(duì)象只是存儲(chǔ)了增量部分,對(duì)于基本的部分將由接下來(lái)的可變長(zhǎng)度的字節(jié)數(shù)用于表示 base object 的距離當(dāng)前對(duì)象的偏移量,接下來(lái)的可變字節(jié)也是用 1-bit MSB 表示下一個(gè)字節(jié)是否是可變長(zhǎng)度的組成部分。對(duì)偏移量取負(fù)數(shù),就可知 base 對(duì)象在當(dāng)前對(duì)象的前面多少字節(jié)。
  • 如果對(duì)象類(lèi)型是 OBJ_REF_DELTA 類(lèi)型,表示的是 Delta 存儲(chǔ),當(dāng)前 git 對(duì)象只是存儲(chǔ)了增量部分,對(duì)于基本的部分,用 20-bytes 存儲(chǔ) Base Object 的 SHA-1 。

2 Data 部分

是經(jīng)過(guò) Zlib 壓縮過(guò)的數(shù)據(jù)。可能是全部數(shù)據(jù),也有可能是 Delta 數(shù)據(jù),具體看 Header 部分的存儲(chǔ)類(lèi)型,如果是 OBJ_OFS_DELTA 或者 OBJ_REF_DELTA 此處存儲(chǔ)的就是增量 (Delta) 數(shù)據(jù),此時(shí)如果要取得全量數(shù)據(jù)的話(huà),需要遞歸的找到最 Base Object,然后 apply delta 數(shù)據(jù),在 base object 基礎(chǔ)上進(jìn)行 apply delta 數(shù)據(jù)也是非常精妙的,此文暫不做介紹。

從上面可以很清晰知道 pack 文件格式,我們?cè)購(gòu)谋镜貍}(cāng)庫(kù)中一探究竟:

不是增量 delta 格式:

SHA-1 type size size-in-packfile offset-in-packfile

增量 delta 格式:

SHA-1 type size size-in-packfile offset-in-packfile depth base-SHA-1
→ git verify-pack -v pack-efbf3149604d24e6ea427b025da0c59245b2c2ea.pack 
cb5a93c4cf9c0ee5b7153a3a35a4fac7a7584804 commit 275 189 12
399334856af4ca4b49c0008a25b6a9f524e40350 commit 69 81 201 1 cb5a93c4cf9c0ee5b7153a3a35a4fac7a7584804
e0efbd5121c31964af1615cf24135a7c6c11cc1d commit 268 187 282
7bc9a5e0199bd4a6d4d223ce7e13239631df9635 commit 29 41 469 1 e0efbd5121c31964af1615cf24135a7c6c11cc1d
2e43c62f6ff99c88d20329487137f8dbabc8b3ec commit 220 157 510
b6f173085f49f109a00b2a3f08a7dc499cc47f1f commit 220 157 667
0466b3f1aadde74234f7dd3f4ef7f1505c50fb0c commit 220 157 824
76c5e45f8e295226b1bc5c8c7e2bc98d7eae6be1 commit 74 85 981 1 b6f173085f49f109a00b2a3f08a7dc499cc47f1f
2729f1fa896d384b49a2f5c53d483eacc0929ebb commit 172 127 1066
3cc58df83752123644fef39faab2393af643b1d2 blob 2 11 1193
62189d1a10cc2a544c4e5b9c4aba9493cf5782dc blob 8 15 1204
a9a5aecf429fd8a0d81fbd5fd37006bfa498d5c1 blob 4 13 1219
2b8982f7c281964658d2cd8b6c17b541533dd277 tree 104 105 1232
92c4aafa39ee387a1f8237f00c78c499aebaf0b2 tree 104 105 1337
223b7836fb19fdf64ba2d3cd6173c6a283141f78 blob 2 11 1442
1756ca64f21724f350fe2cc5cfb218883e314c3d tree 71 80 1453
e11ddfa79f01b01a8e1553bbffaa2d6c03ae9f6e tree 71 80 1533
f70f10e4db19068f79bc43844b49f3eece45c4e8 blob 2 11 1613
e982b6207b10a869164e2c8d19d25ffb059e6a16 tree 66 73 1624
f2e9f73f27124916344e0fd03bb449bc6feca59d tree 66 74 1697
d09da444f461d7cee3679666a1ded5ab79832ed0 tree 33 44 1771
non delta: 18 objects
chain length = 1: 3 objects
pack-efbf3149604d24e6ea427b025da0c59245b2c2ea.pack: ok

如 399334856af4ca4b49c0008a25b6a9f524e40350(SHA-1) 表示對(duì)象的 base object SHA-1 是 cb5a93c4cf9c0ee5b7153a3a35a4fac7a7584804,base 對(duì)象最大深度 (depth) 為 1,如果cb5a93c4cf9c0ee5b7153a3a35a4fac7a7584804 還有引用對(duì)象,則改變 depth 為 2。

pack Header 中最后 4-bytes 用于表示的 pack 文件中 objects 的數(shù)量,最多 2 的 32 次方個(gè)對(duì)象,所以一些大的工程中有多個(gè) pack 文件和多個(gè) idx 文件。

文件的 size (文件解壓縮后大小) 有什么用呢,這個(gè)是為了方便我們進(jìn)行解壓的時(shí)候,設(shè)置流的大小,也就是方便知道流有多大。這里 size 不是說(shuō)明下一個(gè)文件的偏移量,偏移量都是來(lái)自索引文件,見(jiàn)下面 idx:

index 文件

??

??

 

由于 version1 比較簡(jiǎn)單,下面用 version2 為例子:

分層模式:Header,F(xiàn)anout,SHA,CRC,Offset,Big File Offset,Trailer。

Header 層

version2 的 Header 部分總共有 8-bytes,version 1 的 header 部分是沒(méi)有的,前 4-bytes 總是 255, 116, 79, 99 因?yàn)檫@個(gè)也是版本 1 的開(kāi)頭四個(gè)字節(jié),后面 4-bytes 用于表示的是版本號(hào),在當(dāng)前就是 version 2。

Fanout 層

fanout 層是 git 的亮點(diǎn)設(shè)計(jì),也叫 Fanout Table(扇表)。fanout 數(shù)組中存儲(chǔ)的是相關(guān)對(duì)象的數(shù)目,數(shù)組下標(biāo)是對(duì)應(yīng) 16 進(jìn)制數(shù)。fanout 最后一個(gè)存儲(chǔ)的是整個(gè) pack 文件中所有對(duì)象的總數(shù)量。Fanout Table 是整個(gè) git 檢索的核心,通過(guò)它我們可以快速進(jìn)行查詢(xún),用于定位 SHA 層的數(shù)組起始 - 終止下標(biāo),定位好 SHA 層范圍之后,就可以對(duì) SHA 層進(jìn)行二分查找了,而不用對(duì)所有對(duì)象進(jìn)行二分查找。

fanout 總共 256 個(gè),剛好是十六進(jìn)制的 #0xFF。fanout 數(shù)組用 SHA 的前面 2 個(gè)字符作為下標(biāo)(對(duì)應(yīng) .git/objects 中的松散文件目錄名,將 16 進(jìn)制的目錄名轉(zhuǎn)換 10 進(jìn)制數(shù)字),里面值就是用這兩個(gè)字符開(kāi)頭的文件數(shù)量,而且是逐層累加的,后面的數(shù)組數(shù)量是包含前面數(shù)組的數(shù)據(jù)的個(gè)數(shù)的一個(gè)累加。

??

??

 

舉例如下:

1)如果數(shù)組下標(biāo)為 0,且 Fanout[0] = 10 代表著 #0x00 開(kāi)頭的 SHA-1 值的總數(shù)為 10 個(gè)。

2) 如果數(shù)組下標(biāo)為 1,且 Fanout[1] = 15 代表著小于 #0x01 開(kāi)頭的 SHA-1 值的總數(shù)為 15 個(gè),從 Fanout[0] = 10 知 Fanout[1] = (15-10)

為什么 git 設(shè)計(jì)上 Fanout[n] 會(huì)累加 Fanout[n-1] 的數(shù)量?這個(gè)主要是為了快速確定 SHA 層檢索的初始位置,而不用每次去把前面所有 fanout[..n-1] 數(shù)量進(jìn)行累加。

SHA 層

是所有對(duì)象的 SHA-1 的排序,按照名稱(chēng)排序,按照名稱(chēng)進(jìn)行排序是為了用二分搜索進(jìn)行查找。每個(gè) SHA-1 值占 20-bytes。

CRC 層

由于文件打包主要解決網(wǎng)絡(luò)傳輸問(wèn)題,網(wǎng)絡(luò)傳輸?shù)臅r(shí)候必須通過(guò) crc 進(jìn)行校驗(yàn),避免傳輸過(guò)程中的文件損壞。CRC 數(shù)組對(duì)應(yīng)的是每個(gè)對(duì)象的 CRC 校驗(yàn)和。

Offset 層

是由 4 byte 字節(jié)所組成,表示的是每個(gè) SHA-1 文件的偏移量,但是如果文件大于 2G 之后,4 byte 字節(jié)將無(wú)法表示,此時(shí)將:

4 byte 中的第一 bit 就是 MSB,如果是 1 表示的是文件的偏移量是放在第 6 層去存儲(chǔ),此時(shí)剩下的 31-bits 將表示文件在 Big File Offset 中的偏移量,也就是圖中的,通過(guò) Big File Offset 層 就可以知道對(duì)象在 pack 中的 offset。

4 byte 中的第一 bit 就是 MSB,如果是 0 31-bits 表示的存儲(chǔ)對(duì)象在 packfile 中的文件偏移量,此時(shí)不涉及 Big File Offset 層

Big File Offset 層

用于存儲(chǔ)大于 2G 的文件的偏移量。如果文件大于 2G,可以通過(guò) offset 層最后 31 bits 決定在 big file offset 中的位置,big file offset 通過(guò) 8 bytes 來(lái)表示對(duì)象在 pack 文件中的位置,理論上可以表示 2 的 64 次方文件大小。

Trailer 層

包含的是 packfile checksum 和關(guān)聯(lián)的 idx 的 checksum。

索引流程

從上面的分層知道 git 設(shè)計(jì)的巧妙。git 索引文件偏移量的查詢(xún)流程如下:

??

??

 

查詢(xún)算法

通過(guò) idx 文件查詢(xún) SHA-1 對(duì)應(yīng)的偏移量:

??

??

 

在 pack 文件中通過(guò)偏移量找到對(duì)象:

??c4c3114bc561.jpg" target="_blank">c4c3114bc561.jpg" width="auto" border="0" height="auto" alt="" title="">??

 

如果是普通的存儲(chǔ)類(lèi)型。定位到的對(duì)象就是用 Zlib 壓縮之后的對(duì)象,直接解壓縮即可。

如果是 Delta 類(lèi)型需要 遞歸查出 Delta 的 Base 對(duì)象,然后再把 delta data 應(yīng)用到 base object 上(可參考 git-apply-delta)。

參考資料

git 大多資料主要介紹是 git 使用,很少系統(tǒng)去講解底層數(shù)據(jù)結(jié)構(gòu)和原理。本文通過(guò)多個(gè)開(kāi)源代碼入手,結(jié)合 git 文檔,參考相關(guān) git 開(kāi)發(fā)者或相關(guān)研究文章,git 郵件列表等。下面是我探究覺(jué)得比較可靠的資料文檔集。

參考文檔

??https://stackoverflow.com/questions/8198105/how-does-git-store-files??

??https://www.npmjs.com/package/git-apply-delta??

??https://git-scm.com/book/en/v2/Git-Internals-Packfiles??

??https://codewords.recurse.com/issues/three/unpacking-git-packfiles??

??http://shafiulazam.com/gitbook/7_the_packfile.html??

??http://wiki.jikexueyuan.com/project/git-community-book/packfile.html??

??http://documentup.com/skwp/git-workflows-book??

??http://www.runoob.com/git/git-workspace-index-repo.html??

??http://shafiulazam.com/gitbook/1_the_git_object_model.html??

??http://eagain.net/articles/git-for-computer-scientists/??

??https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#object-details??

??https://stackoverflow.com/documentation/git/topics??

??https://stackoverflow.com/search?page=2&tab=Votes&q=user%3a1256452%20%5bgit%5d??

??http://git.oschina.net/progit/9-Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86.html#9.5-The-Refspec??

??https://codewords.recurse.com/issues/three/unpacking-git-packfiles??

??http://shafiulazam.com/gitbook/7_the_packfile.html??

 

??https://w.org/pub/software/scm/git/docs/user-manual.html#object-details??

git 源碼

sha1_file.c sha1_object_info_extended 讀取對(duì)象

sha1_file.c find_pack_entry_one 從索引中尋找

其他 git 源碼

go-git https://github.com/src-d/go-gitgit

go https://github.com/ChimeraCoder/gitgo

【本文為51CTO專(zhuān)欄作者“阿里巴巴官方技術(shù)”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

 

??戳這里,看該作者更多好文??

 

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2024-09-03 08:40:31

2020-03-26 09:18:54

高薪本質(zhì)因素

2023-06-08 07:25:56

數(shù)據(jù)庫(kù)索引數(shù)據(jù)結(jié)構(gòu)

2019-04-17 15:35:37

Redis數(shù)據(jù)庫(kù)數(shù)據(jù)結(jié)構(gòu)

2023-09-15 08:14:48

HashMap負(fù)載因子

2024-08-13 17:09:00

架構(gòu)分庫(kù)分表開(kāi)發(fā)

2025-01-13 12:00:00

反射Java開(kāi)發(fā)

2020-08-04 10:56:09

進(jìn)程線(xiàn)程協(xié)程

2020-07-16 09:02:45

aPaaS云計(jì)算aPaaS平臺(tái)

2021-12-16 14:45:09

https架構(gòu)服務(wù)端

2021-01-18 13:05:52

Serverless Serverfull FaaS

2020-12-01 11:34:14

Elasticsear

2023-04-28 08:53:09

2019-09-27 08:53:47

Redis數(shù)據(jù)C語(yǔ)言

2023-11-09 08:41:25

DevOpsAIOps軟件

2023-05-04 08:24:52

ChatGPT產(chǎn)品經(jīng)理工業(yè)革命

2019-10-29 08:59:16

Redis底層數(shù)據(jù)

2021-08-31 07:36:22

LinkedListAndroid數(shù)據(jù)結(jié)構(gòu)

2024-11-07 15:36:34

2020-07-16 07:30:15

數(shù)據(jù)庫(kù)SQL技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩女优人人人人射在线视频| 精品国产露脸精彩对白| 一区二区三区三区在线| 一卡二卡在线观看| 亚洲大胆视频| 亚洲天堂av在线免费| 992kp快乐看片永久免费网址| 午夜老司机在线观看| 国产91精品一区二区麻豆亚洲| 久久久久久久久综合| 高清国产在线观看| 亚洲一区二区三区四区电影| 日韩欧美福利视频| 一级全黄肉体裸体全过程| 欧美一级特黄aaaaaa大片在线观看| 亚洲欧美日本国产专区一区| www.日韩.com| 亚洲第一香蕉网| 成人在线啊v| 色综合天天性综合| 国产免费裸体视频| 日本www在线观看视频| 99精品视频中文字幕| 成人精品一区二区三区电影黑人| 日韩大片免费在线观看| 亚洲国产一成人久久精品| 日韩成人在线视频观看| 天天操精品视频| av激情成人网| 欧美日韩在线第一页| 男女啪啪免费观看| 91福利在线视频| 久久久久久久久久看片| 国产精品日韩高清| 国产激情无套内精对白视频| 日韩va欧美va亚洲va久久| 高清视频欧美一级| 麻豆精品一区二区三区视频| 91影院成人| 亚洲人成电影在线播放| 青青草成人免费视频| 视频一区日韩精品| 91精品午夜视频| 少妇一级淫免费放| 久久野战av| 一本到不卡精品视频在线观看| 人体内射精一区二区三区| 18在线观看的| 亚洲蜜臀av乱码久久精品| 色综合久久av| av一区在线观看| 91在线看国产| 精品视频第一区| 日日夜夜精品免费| www.亚洲色图.com| 国产美女精品久久久| 精品国产免费无码久久久| 激情久久五月天| 国产日韩一区在线| 国产精品久久久久久久久久久久久久久久 | 日韩av一区在线观看| 91传媒理伦片在线观看| 久久国产精品色av免费看| 亚洲第一福利网| 最新版天堂资源在线| 欧美黑人做爰爽爽爽| 亚洲美女免费精品视频在线观看| a级在线观看视频| 精品在线99| 国产香蕉精品视频一区二区三区| 亚洲av毛片基地| 91蜜臀精品国产自偷在线| 日韩色av导航| 久久久久97国产| 国产麻豆综合| 国产精品影院在线观看| 国产视频手机在线| 成人av电影免费在线播放| 久久超碰亚洲| 91在线播放网站| 一区二区三区在线免费| 自拍日韩亚洲一区在线| 日韩不卡免费高清视频| 7799精品视频| 奇米777第四色| 欧美日韩在线网站| 久久综合88中文色鬼| 国产午夜小视频| 玖玖玖国产精品| 亚洲一区二区三区毛片| 人人妻人人澡人人爽人人欧美一区 | 国产男女猛烈无遮挡a片漫画 | 亚洲AV无码成人精品区东京热| 肉色丝袜一区二区| 亚洲综合中文字幕在线| 日韩专区一区二区| 亚洲欧美福利一区二区| 国产97在线 | 亚洲| 欧美日韩破处视频| 亚洲国产精品成人va在线观看| 91在线无精精品白丝| 欧美日韩一区二区国产| 国产成人精品优优av| 精品久久久无码中文字幕| 久久综合久久99| 中国老女人av| 成人日韩在线| 亚洲国产精品悠悠久久琪琪| 91久久久久久久久久久久久久 | 欧美婷婷精品激情| 国产suv精品一区| 日韩亚洲成人av在线| 国产成人无码精品久久久久| 老鸭窝一区二区久久精品| 国产无套精品一区二区| 欧美被日视频| 色诱亚洲精品久久久久久| 图片区偷拍区小说区| 久久人人88| 欧美中文字幕精品| 成人午夜视频一区二区播放| 亚洲欧洲精品一区二区精品久久久 | 九九热久久66| 色爱综合区网| 欧美电影在线免费观看| 欧洲美熟女乱又伦| 新67194成人永久网站| 国产精品乱子乱xxxx| 黄色精品在线观看| 欧美中文字幕不卡| 香蕉网在线播放| 亚洲经典三级| 国产精品18毛片一区二区| 国产三区在线观看| 欧美久久免费观看| 丁香六月激情综合| 石原莉奈在线亚洲二区| 欧美日韩国产免费一区二区三区| 白浆视频在线观看| 亚洲国产精品电影| www.av麻豆| 99久久99久久精品免费看蜜桃| 妞干网视频在线观看| 日韩精品成人在线观看| 美女少妇精品视频| www.av导航| 一区二区免费看| 成人做爰69片免费| 国色天香一区二区| 成人自拍爱视频| 国产美女情趣调教h一区二区| 日韩欧美一区二区三区在线| 男的操女的网站| 久久精品国产一区二区三区免费看 | 亚洲一区二区三区精品在线| 亚洲国产欧美日韩在线| 欧美.www| 国产精品久久久久久免费观看| 高清电影在线观看免费| 亚洲精品狠狠操| 中文字幕亚洲精品一区| 久久久久久久久久久久久女国产乱 | 亚洲成人精品视频在线观看| 国产精品500部| 久久影音资源网| 男人添女人下面免费视频| 99精品视频精品精品视频| 91成人免费观看| 欧美卡一卡二| 精品视频在线观看日韩| 成年人晚上看的视频| 国产精品久久福利| 精品国产乱码久久久久夜深人妻| 国产欧美日韩一级| 午夜精品电影在线观看| 国产精品白丝久久av网站| 久久久久久久久国产| 三区在线视频| 9191精品国产综合久久久久久| 青娱乐国产精品| 久久综合五月天婷婷伊人| 亚洲最大成人在线观看| 欧美一区二区三区久久精品茉莉花| 国产精品一区二区免费| 韩国三级一区| 欧美精品一区三区| 欧美视频免费一区二区三区| 4438x亚洲最大成人网| 日韩精品无码一区二区| 国产精品久久精品日日| 粉嫩av懂色av蜜臀av分享| 麻豆国产欧美一区二区三区| 久久久久99精品成人片| 国产精品密蕾丝视频下载| 91精品视频一区| 免费成人直播| 色综合男人天堂| youjizz在线播放| 亚洲精品在线免费播放| 在线亚洲欧美日韩| 欧美日韩亚洲网| 免费人成在线观看| 中文字幕+乱码+中文字幕一区| 精品1卡二卡三卡四卡老狼| 男女性色大片免费观看一区二区| 黄网站色视频免费观看| 欧美日韩国产一区二区三区不卡 | 国产小视频免费在线网址| 欧美一区二区三区日韩视频| 在线永久看片免费的视频| 亚洲一区二区三区四区在线免费观看 | 亚洲一区二区三区四区在线免费观看 | 国产区精品区| 国产伦精品一区二区三区视频免费 | 亚洲主播在线| 成人免费在线视频播放| 91青青国产在线观看精品| 欧美精品v日韩精品v国产精品| 少妇精品在线| 成人写真视频福利网| av成人亚洲| 日韩美女毛茸茸| 超碰在线视屏| 国内精品久久久久伊人av| 超碰在线免费公开| 色哟哟亚洲精品一区二区| 黄视频在线播放| 精品网站999www| 熟妇人妻系列aⅴ无码专区友真希| 欧美一区二区国产| av一级黄色片| 91超碰这里只有精品国产| 91成人国产综合久久精品| 欧美色偷偷大香| 国产免费a视频| 91福利在线免费观看| 亚洲 欧美 日韩 在线| 狠狠久久五月精品中文字幕| 日本一级淫片免费放| 亚洲国产日韩综合久久精品| 曰本女人与公拘交酡| 亚洲美女淫视频| 国产精品老熟女一区二区| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲欧洲韩国日本视频| 网站永久看片免费| 国产精品成人免费在线| 永久免费看mv网站入口| 亚洲欧洲日产国产综合网| 无码人妻精品中文字幕| 亚洲三级视频在线观看| 天天天天天天天天操| 一区二区三区中文字幕电影| 国产少妇在线观看| 一区二区三区蜜桃| 国产一级av毛片| 欧美日韩精品二区| 销魂美女一区二区| 欧美日韩国产一二三| 国产手机视频在线| 精品国产区一区| 亚州精品国产精品乱码不99按摩| 日韩成人中文字幕| 成人高清网站| 久久视频国产精品免费视频在线| av网站在线免费| 久久久久久这里只有精品| 日韩伦理在线一区| 国产精品户外野外| 国产成人免费视频网站视频社区| 亚洲va欧美va在线观看| www国产精品| 日本不卡免费新一二三区| 97视频热人人精品免费| 91免费国产精品| 美女爽到呻吟久久久久| 亚洲高清免费在线观看| 国产福利精品一区二区| 日韩aaaaa| 国产精品每日更新| 国产在线观看免费av| 日韩欧美高清视频| 国产区精品在线| 亚洲精品国偷自产在线99热| 午夜免费福利在线观看| 久久久久久国产精品三级玉女聊斋| 亚洲女同志freevdieo| 国产中文欧美精品| 人人香蕉久久| 香蕉视频在线网址| 国产精品久久777777毛茸茸 | 国产精品久久久久久久久久久久久久久久| 日韩免费观看高清完整版| 精品亚洲综合| 久久99久久久久久久噜噜| 玛雅亚洲电影| 成人91视频| 日韩一区二区在线免费| 久久久久久久久久久99| 国产真实乱子伦精品视频| 国产精品无码一区二区三区免费| 中文字幕一区二区三区不卡在线| 亚洲国产成人精品激情在线| 337p亚洲精品色噜噜噜| 可以在线观看的av| 久久久免费av| 9999精品视频| 日韩av电影免费在线观看| 1024日韩| 国产91在线免费观看| 国产欧美日韩三区| yjizz国产| 精品国产免费人成电影在线观看四季| 中文日本在线观看| 日本久久亚洲电影| 美女扒开腿让男人桶爽久久动漫| 小说区视频区图片区| 日韩国产成人精品| 国产三级视频网站| 亚洲aaa精品| 午夜精品久久久久久久第一页按摩 | 狠狠色香婷婷久久亚洲精品| 亚洲a视频在线观看| 日韩视频一区在线| 成人在线视频免费看| 欧美日韩在线一二三| 一区二区日本视频| 亚洲婷婷在线观看| 亚洲图片欧美色图| www.久久综合| 久久91亚洲人成电影网站| 电影中文字幕一区二区| 中文字幕人成一区| 久久国产婷婷国产香蕉| 亚洲一二三精品| 欧美午夜精品一区| 成人在线免费观看| 国产精品久久一区| 日韩一区亚洲二区| 中文字幕天天干| 国产精品久久久久久久久果冻传媒| 国产偷人爽久久久久久老妇app | 人妻无码一区二区三区免费| 欧美伊人精品成人久久综合97| 久久av少妇| 国产精品国产亚洲伊人久久| 精品一区av| 日本人69视频| 亚洲人成网站精品片在线观看| 国产手机av在线| 欧美精品在线第一页| 亚洲欧美日本国产| 青青草精品视频在线| 99久久精品免费看国产免费软件| 日韩 欧美 亚洲| 亚洲欧美日韩国产中文| 99re66热这里只有精品4| 神马影院一区二区| 激情综合色综合久久综合| 欧美精品久久久久久久久46p| 欧美一二三四在线| 搞黄网站在线看| 免费久久一级欧美特大黄| 日本不卡一区二区| 国产午夜精品理论片在线| 日韩精品自拍偷拍| 人在线成免费视频| 亚洲第一综合| 国产高清亚洲一区| 日韩 欧美 综合| 伊人伊成久久人综合网站| japansex久久高清精品| 妞干网在线视频观看| 国产色产综合色产在线视频| 97超碰人人草| 久久久伊人欧美| 精品国产99| 成年人性生活视频| 狠狠久久亚洲欧美专区| 巨大荫蒂视频欧美另类大| 国产精品视频在线免费观看| 可以看av的网站久久看| 国产成人综合在线视频| 日韩精品在线观看一区| 四虎国产精品免费久久5151| 日本熟妇人妻xxxx| 国产精品国产自产拍高清av | 久久久久88色偷偷免费| 99热在线只有精品| 2019中文字幕在线观看| 婷婷综合视频| 婷婷色一区二区三区| 精品国产乱子伦一区| 欧美国产日韩电影| 欧美精品久久久久久久自慰| 中文字幕第一区第二区| 天天干天天色天天| 亚洲va电影大全| 日韩激情视频网站| 国产对白videos麻豆高潮|