偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Git內(nèi)部原理之Git對象存儲

存儲 存儲軟件
在Git內(nèi)部原理之Git對象哈希中,講解了Git對象hash的原理,接下來的這篇文章講一講Git對象如何存儲。

在Git內(nèi)部原理之Git對象哈希中,講解了Git對象hash的原理,接下來的這篇文章講一講Git對象如何存儲。

[[238127]]

原理

數(shù)據(jù)對象、樹對象和提交對象都是存儲在.git/objects目錄下,目錄的結(jié)構(gòu)如下:

  1. .git 
  2. |-- objects 
  3.     |-- 01 
  4.     |   |-- 55eb4229851634a0f03eb265b69f5a2d56f341 
  5.     |-- 1f 
  6.     |   |-- 7a7a472abf3dd9643fd615f6da379c4acb3e3a 
  7.     |-- 83 
  8.         |-- baae61804e65cc73a7201a7252750c76066a30 

從上面的目錄結(jié)構(gòu)可以看出,Git對象的40位hash分為兩部分:頭兩位作為文件夾,后38位作為對象文件名。所以一個(gè)Git對象的存儲路徑規(guī)則為:

  1. .git/objects/hash[0, 2]/hash[2, 40] 

這里就產(chǎn)生了一個(gè)疑問:為什么Git要這么設(shè)計(jì)目錄結(jié)構(gòu),而不直接用Git對象的40位hash作為文件名?原因是有兩點(diǎn):

  • 有些文件系統(tǒng)對目錄下的文件數(shù)量有限制。例如,F(xiàn)AT32限制單目錄下的***文件數(shù)量是65535個(gè),如果使用U盤拷貝Git文件就可能出現(xiàn)問題。
  • 有些文件系統(tǒng)訪問文件是一個(gè)線性查找的過程,目錄下的文件越多,訪問越慢。

在Git內(nèi)部原理之Git對象哈希中,我們知道Git對象會在原內(nèi)容前加個(gè)一個(gè)頭部:

  1. store = header + content 

Git對象在存儲前,會使用zlib的deflate算法進(jìn)行壓縮,即簡要描述為:

  1. zlib_store = zlib.deflate(store) 

壓縮后的zlib_store按照Git對象的路徑規(guī)則存儲到.git/objects目錄下。

總結(jié)下Git對象存儲的算法步驟:

  1. 計(jì)算content長度,構(gòu)造header;
  2. 將header添加到content前面,構(gòu)造Git對象;
  3. 使用sha1算法計(jì)算Git對象的40位hash碼;
  4. 使用zlib的deflate算法壓縮Git對象;
  5. 將壓縮后的Git對象存儲到.git/objects/hash[0, 2]/hash[2, 40]路徑下;

Nodejs實(shí)現(xiàn)

接下來,我們使用Nodejs來實(shí)現(xiàn)git hash-object -w的功能,即計(jì)算Git對象的hash值并存儲到Git文件系統(tǒng)中:

  1. const fs = require('fs'
  2. const crypto = require('crypto'
  3. const zlib = require('zlib'
  4. function gitHashObject(content, type) { 
  5.   // 構(gòu)造header 
  6.   const header = `${type} ${Buffer.from(content).length}\0` 
  7.   // 構(gòu)造Git對象 
  8.   const store = Buffer.concat([Buffer.from(header), Buffer.from(content)]) 
  9.   // 計(jì)算hash 
  10.   const sha1 = crypto.createHash('sha1'
  11.   sha1.update(store) 
  12.   const hash = sha1.digest('hex'
  13.   // 壓縮Git對象 
  14.   const zlib_store = zlib.deflateSync(store) 
  15.   // 存儲Git對象 
  16.   fs.mkdirSync(`.git/objects/${hash.substring(0, 2)}`) 
  17.   fs.writeFileSync(`.git/objects/${hash.substring(0, 2)}/${hash.substring(2, 40)}`, zlib_store) 
  18.   console.log(hash) 
  19. // 調(diào)用入口 
  20. gitHashObject(process.argv[2], process.argv[3]) 

***,測試下能否正確存儲Git對象:

  1. $ node index.js 'hello, world' blob 
  2. 8c01d89ae06311834ee4b1fab2f0414d35f01102 
  3. $ git cat-file -p 8c01d89ae06311834ee4b1fab2f0414d35f01102 
  4. hello, world 

由此可見,我們生成了一個(gè)合法的Git數(shù)據(jù)對象,證明算法是正確的。

責(zé)任編輯:武曉燕 來源: jingsam
相關(guān)推薦

2020-03-05 16:47:51

Git內(nèi)部儲存

2021-02-05 15:01:41

GitLinux命令

2020-04-14 20:40:58

Git內(nèi)部存儲

2025-09-12 08:36:44

2020-08-20 07:41:52

Git原理版本

2015-08-20 10:42:17

2016-12-19 14:59:55

Git二進(jìn)制管理

2011-10-08 14:09:27

JavaScript

2016-08-03 15:32:50

GitLinux開源

2016-08-02 11:06:34

開源Linux版本控制

2022-02-10 09:56:33

git revertgit resetGit

2024-07-22 14:14:01

2015-08-07 09:36:25

git筆記

2025-04-11 08:26:41

2020-01-18 18:41:13

GitGit服務(wù)器開源

2022-06-02 15:34:45

vmstorage監(jiān)控

2022-06-08 07:34:02

持久化數(shù)據(jù)存儲原理索引存儲格式

2023-10-24 08:37:00

git工具開源

2020-11-23 07:27:22

Git Flow

2022-02-09 18:55:30

LazygitGit命令維護(hù)項(xiàng)目
點(diǎn)贊
收藏

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