成人免费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技術棧公眾號

主站蜘蛛池模板: 国产成人福利视频 | 欧日韩不卡在线视频 | 亚洲精品一区二区三区中文字幕 | 日韩激情网 | 日韩成人精品在线观看 | 欧美一级特黄aaa大片在线观看 | 久久精品国产一区二区电影 | 国产1区2区 | 久草网址 | 天天躁日日躁狠狠很躁 | 日本福利视频免费观看 | 艹逼网| 日本韩国欧美在线观看 | 久久999 | 精品国产91| 美女131mm久久爽爽免费 | 日本三级做a全过程在线观看 | 亚洲欧美中文字幕 | 国产成人精品免高潮在线观看 | 亚洲精品乱码 | 日本亚洲精品成人欧美一区 | 国产一级片在线播放 | 91亚洲欧美 | 亚洲国产二区 | 久久精品中文字幕 | 欧美亚州综合 | av网站在线播放 | 欧美aⅴ片 | 国产农村妇女毛片精品久久麻豆 | 欧美久 | 成人综合一区 | 国产欧美日韩综合精品一 | 久久中文字幕一区 | 日韩一区二区三区av | 黄色免费网站在线看 | 一级做受毛片免费大片 | 国产欧美精品一区二区三区 | 99精品视频一区二区三区 | 亚洲狠狠 | 精品国产99 | 毛色毛片免费看 |