惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
爱范儿
爱范儿
Y
Y Combinator Blog
T
Tor Project blog
V
Visual Studio Blog
U
Unit 42
B
Blog RSS Feed
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
G
Google Developers Blog
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
博客园_首页
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
P
Proofpoint News Feed
Jina AI
Jina AI
博客园 - 【当耐特】
S
Security @ Cisco Blogs
I
Intezer
MyScale Blog
MyScale Blog
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy & Cybersecurity Law Blog
腾讯CDC
T
Tenable Blog
A
Arctic Wolf
T
Threat Research - Cisco Blogs
S
Securelist
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
C
Check Point Blog
NISL@THU
NISL@THU
Microsoft Security Blog
Microsoft Security Blog
V
Vulnerabilities – Threatpost

ZDDHUB

PixelsMeasure 开发第二年总结 PixelsMeasure 开发一年总结 Swift/SwiftUI 踩坑记 为什么说 GPT 利好程序员 ChatGPT 编程实现 Web 数字水印 Web 数字水印探究 Micro Frontends for Mobile URL 加载系统(URL Loading System) Protocol Buffers GraphQL 从 0 到 1 开发一款 IOS 应用 - Swift MV* 软件设计架构 学习一个新技巧需要多久? 不停机数据库迁移 Rspec 如何 mock update 方法更新自己? Rails 使用 mysql2 出现的段错误 使用 Docker-compose 部署 Rails 应用到生产环境 Cocoa troubleshooting 独孤九剑 Dit (0x05) - 终端篇 Gem-based Jekyll theme 开发小记 Miscellaneous 前端手记 TodoMVC 之 Redux 篇 前端手记 TodoMVC 之 Server 篇 前端手记 TodoMVC 之 React 篇 前端手记 TodoMVC 之 CSS 篇 独孤九剑 Dit (0x04) - 测试篇 英语小抄 LLDB debug Golang Make mistakes 大牛俱乐部上线啦 独孤九剑 Dit (0x02) - 数据结构篇 独孤九剑 Dit (0x01) - 总决 独孤九剑 Dit (0x00) - 我为什么要做 Dit 零值强制类型转换的使用 终端颜色输出重定向 Go语法简略 - 正则表达式 Makefile Go语法简略 - Duck框架探索 Go语法简略 - 依赖注入 Go语法简略 - web应用框架 Go语法简略 - 反射 Go语法简略 - 面向对象 Go语法简略 - goroutine Go语法简略 - 方法和接口 Go语法简略 - 基础篇 大牛 轻松科研 未来这几年 为 Android Studio 创建图标 Shell Git Vim 金庸答百问 论拖延症 Flex, A fast scanner generator 有理想的人 从虚拟到现实 常用视频转接口 Recognizer configuration on CentOS 整个世界清静了 《Python源码剖析》读书笔记
独孤九剑 Dit (0x03) - 缓存篇
zddhub · 2016-06-19 · via ZDDHUB

每个人都会变成自己讨厌的人

Git 通过二进制文件 .git/index 来缓存当前目录,实现工作目录和仓库数据的快速交换。Git 的缓存却保存在 index 文件里,为什么不是 cache,很奇怪。

Git 当前目录缓存至少应该满足以下功能:

  1. 可随时根据当前仓库(HEAD 状态)生成缓存。
  2. 缓存不一定总是和仓库状态保持一致。
  3. 缓存数据格式固定,可长期被多个 Git 命令解析。

Git index 文件格式

当前目录缓存文件承担多个 Git 命令之间的数据交换和传递,它的文件格式也比较重要。

Git index (version 2) 使用二进制方式存储,存储内容如下:

commits-and-parents

详细的格式可以在这里找到 Git index format

Linus 在一开始就预留了版本信息,为以后 index 的文件格式变动提供方便,值得我们借鉴。

除了 Git object 要求的 flags/size/path name/sha1 之外, 每个 index 项还存储了 stat 2 的信息。对 index 文件也使用 sha1 编码,用来验证数据的正确与否。

另外,index 文件的安排和实现,都尽可能少的使用空间,并用二进制方式存储。节约资源是大牛的基本素养,要保持!

Dit 选择使用 version 2 版本的 index 文件格式实现。

通过解析 Git index 文件到 Git 基础数据结构,Git 的雏形就得到了。接下来的几天里,我会实现一个初级版本的 Dit 系统,因为设计和内容都大幅度的模仿了 Git,所以会使用和 Git 相同的 License 开源。

我写了一个简易版本的 Git index 解析工具,去 Github 看一看吧。

如果你喜欢这篇文章,欢迎赞赏作者以示鼓励