自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Git內(nèi)部原理之Git對(duì)象存儲(chǔ)

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

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

[[238127]]

原理

數(shù)據(jù)對(duì)象、樹對(duì)象和提交對(duì)象都是存儲(chǔ)在.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對(duì)象的40位hash分為兩部分:頭兩位作為文件夾,后38位作為對(duì)象文件名。所以一個(gè)Git對(duì)象的存儲(chǔ)路徑規(guī)則為:

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

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

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

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

  1. store = header + content 

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

  1. zlib_store = zlib.deflate(store) 

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

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

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

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

接下來,我們使用Nodejs來實(shí)現(xiàn)git hash-object -w的功能,即計(jì)算Git對(duì)象的hash值并存儲(chǔ)到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對(duì)象 
  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對(duì)象 
  14.   const zlib_store = zlib.deflateSync(store) 
  15.   // 存儲(chǔ)Git對(duì)象 
  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]) 

***,測試下能否正確存儲(chǔ)Git對(duì)象:

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

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

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

2020-03-05 16:47:51

Git內(nèi)部儲(chǔ)存

2021-02-05 15:01:41

GitLinux命令

2020-04-14 20:40:58

Git內(nèi)部存儲(chǔ)

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筆記

2020-01-18 18:41:13

GitGit服務(wù)器開源

2025-04-11 08:26:41

2023-10-24 08:37:00

git工具開源

2022-06-08 07:34:02

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

2022-06-02 15:34:45

vmstorage監(jiān)控

2020-11-23 07:27:22

Git Flow

2022-02-09 18:55:30

LazygitGit命令維護(hù)項(xiàng)目

2017-02-08 13:33:34

AndroidJavaPhp
點(diǎn)贊
收藏

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