独孤九剑(0x03) - 当前目录缓存篇

zddhub · · 1750 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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

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

  1. 可随时根据当前仓库(HEAD 状态)生成缓存。

  2. 缓存不一定总是和仓库状态保持一致。

  3. 缓存数据格式固定,可长期被多个 Git 命令解析。

Git index 文件格式

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

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

详细的格式可以在这里找到 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 查看。


木乙言己 zddhub 出品
微信号: zddnotes
Just for fun!

文章只写给自己,如果你也喜欢,欢迎扫描以下二维码关注哦~


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:zddhub

查看原文:独孤九剑(0x03) - 当前目录缓存篇

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1750 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传