成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Git內部原理之Git對象存儲

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

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

[[238127]]

原理

數據對象、樹對象和提交對象都是存儲在.git/objects目錄下,目錄的結構如下:

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

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

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

這里就產生了一個疑問:為什么Git要這么設計目錄結構,而不直接用Git對象的40位hash作為文件名?原因是有兩點:

  • 有些文件系統對目錄下的文件數量有限制。例如,FAT32限制單目錄下的***文件數量是65535個,如果使用U盤拷貝Git文件就可能出現問題。
  • 有些文件系統訪問文件是一個線性查找的過程,目錄下的文件越多,訪問越慢。

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

  1. store = header + content 

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

  1. zlib_store = zlib.deflate(store) 

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

總結下Git對象存儲的算法步驟:

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

Nodejs實現

接下來,我們使用Nodejs來實現git hash-object -w的功能,即計算Git對象的hash值并存儲到Git文件系統中:

  1. const fs = require('fs'
  2. const crypto = require('crypto'
  3. const zlib = require('zlib'
  4. function gitHashObject(content, type) { 
  5.   // 構造header 
  6.   const header = `${type} ${Buffer.from(content).length}\0` 
  7.   // 構造Git對象 
  8.   const store = Buffer.concat([Buffer.from(header), Buffer.from(content)]) 
  9.   // 計算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. // 調用入口 
  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 

由此可見,我們生成了一個合法的Git數據對象,證明算法是正確的。

責任編輯:武曉燕 來源: jingsam
相關推薦

2020-03-05 16:47:51

Git內部儲存

2021-02-05 15:01:41

GitLinux命令

2020-04-14 20:40:58

Git內部存儲

2020-08-20 07:41:52

Git原理版本

2015-08-20 10:42:17

2016-12-19 14:59:55

Git二進制管理

2011-10-08 14:09:27

JavaScript

2016-08-02 11:06:34

開源Linux版本控制

2016-08-03 15:32:50

GitLinux開源

2015-08-07 09:36:25

git筆記

2022-02-10 09:56:33

git revertgit resetGit

2024-07-22 14:14:01

2022-06-08 07:34:02

持久化數據存儲原理索引存儲格式

2022-06-02 15:34:45

vmstorage監控

2025-04-11 08:26:41

2020-01-18 18:41:13

GitGit服務器開源

2023-10-24 08:37:00

git工具開源

2015-10-12 09:34:29

git教程

2013-12-16 15:19:10

GitDocker

2017-02-08 13:33:34

AndroidJavaPhp
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 四季久久免费一区二区三区四区 | 亚洲激情在线视频 | 青青草网站在线观看 | 精品久久伊人 | 国产久 | 国产精品色 | 久久专区| 国产精品综合视频 | 日韩欧美一区二区在线播放 | 成人免费网站在线 | 国产日韩精品视频 | 久久精品| 亚洲成人网在线播放 | 一区二区三区不卡视频 | 香蕉久久a毛片 | 国产一区二区电影 | 色播99| 久久久青草婷婷精品综合日韩 | 亚洲第一在线视频 | 99精品一区二区三区 | 国产一级片免费视频 | 4h影视 | www.日韩系列| 欧美视频免费在线 | www.成人在线视频 | 久久久久久亚洲欧洲 | www.国产精 | 国产成人免费视频网站视频社区 | 日韩在线中文 | 日韩欧美国产精品一区二区 | 久久精品国产a三级三级三级 | 欧美精品久久 | 97超碰在线播放 | 亚洲天堂色 | 日韩毛片在线观看 | 久久免费香蕉视频 | 中文字幕免费观看 | 国产自产c区 | 亚洲成人a v | 一区二区三区四区视频 | 欧美一区2区三区4区公司二百 |