为了账号安全,请及时绑定邮箱和手机立即绑定

git索引到底包含什么?

git索引到底包含什么?

Git
拉莫斯之舞 2019-08-03 03:03:11
git索引到底包含什么?Git索引到底包含什么,我可以使用什么命令来查看索引的内容?更新谢谢你的回答。我知道索引充当一个分阶段区域,提交的内容是在索引中而不是在工作树中。我只是好奇索引对象是由什么组成的。我想可能是一个文件名/目录名的列表,SHA-1对,可能是一种虚拟树?用Git术语来说,有没有管道命令,可以用来列出索引的内容吗?
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

Git书中有一篇关于索引包括什么?:

索引是一个二进制文件(通常保存在.git/index)包含一个排序的路径名称列表,每个路径名称都具有权限和BLOB对象的SHA 1;git ls-files可以显示索引的内容:

$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0   .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0   .mailmap

这个活泼的Git问题给出了关于该结构的更多细节:

索引是GIT中最重要的数据结构之一。
它通过记录路径及其对象名称的列表来表示虚拟工作树状态,并充当一个临时区域来写出要提交的下一个树对象。
状态是“虚拟的”,因为它不一定要,而且通常不匹配工作树中的文件。


想看更多,参考文献。“git/Documentation/technical/index-format.txt":

Git索引文件具有以下格式

所有二进制数字都是按网络字节顺序排列的。
第2版在此说明,除非另有说明。

  • 由以下内容组成的12字节头:
    • 4字节

      签名:

      签名是{‘

      D', 'I', 'R', 'C

      )(代表“

      dircache")

    • 4字节

      版本号:

      当前支持的版本是2、3和4。
    • 索引条目的32位数。
  • 若干排序

    索引条目.

  • 扩展:

    扩展是通过签名标识的。


    如果Git不理解它们,则可以忽略可选扩展。


    GIT目前支持缓存树和解析撤消扩展。
    • 4字节扩展签名。如果第一个字节是‘

      A'..'Z

      ‘扩展是可选的,可以忽略。
    • 扩展的32位大小
    • 扩展数据
  • 在此校验和之前,160位SHA-1超过索引文件的内容.

mljrg 评论意见:

如果索引是准备下一次提交的地方,为什么没有“git ls-files -s“提交后什么也不归还?

因为索引表示正在跟踪的内容。,在提交之后,正在跟踪的内容与最后一次提交相同(git diff --cached什么也不回)。

所以git ls-files -s列出跟踪的所有文件(输出中的对象名称、模式位和阶段号)。

这个列表(跟踪的元素)是用提交的内容初始化的。
切换分支时,索引内容将重置为刚刚切换到的分支引用的提交。


GIT2.20(2018年Q4)增加了一个索引项偏移表(IEOT):

看见提交77f 112承诺3255089提交abb4bb8提交c 780b9c提交3b1d9e0承诺371 ed0d(2018年10月10日)本·皮尔特benpeart).
看见提交252 d079(2018年9月26日)ễn Thái Ngọc Duy(pclouds).
(合并为Junio C Hamano-gitster --在……里面提交e27bfaa,2018年10月19日)

增加索引条目偏移表(IEOT)扩展

此修补程序通过向索引中添加额外的数据来解决加载索引的CPU成本,这将使我们能够高效地多线程加载和转换缓存条目。

它通过向索引文件中的缓存条目块添加一个(可选的)索引扩展来实现这一点。

为了实现V4索引的工作,在编写缓存条目时,它会周期性地“重置”前缀-通过对当前条目进行编码来进行压缩,就好像前面条目的路径名称完全不同一样,并将该条目的偏移量保存在IEOT中。
基本上,使用V4索引,它会将偏移生成前缀压缩条目块.

带着新的index.linesconfig设置,索引加载速度更快。


因此(使用IEOT), 提交7bd9631清理read-cache.c load_cache_entries_threaded()Git 2.23(Q3 2019)的职能。

看见承诺8373037提交d713e88提交d 92349d承诺113 c29a提交c95fc72提交7a2a721提交C 016579提交为27fb7实施13a1781提交7bd9631提交3c1dce8提交cf7a901提交d64db5b提交76a7bc0(2019年5月9日)杰夫·金(peff).
(合并为Junio C Hamano-gitster --在……里面提交c0e78f7,2019年6月13日)

读取-缓存:从线程加载中删除未使用的参数。

这个load_cache_entries_threaded()函数采用src_offset参数不使用的参数。它自成立以来就一直存在。77ff112 (read-cache:在工作线程上加载缓存条目,2018-10-10,Git v2.20.0-rc0)。

深入了解邮件列表,该参数是系列的早期迭代,但是当代码切换到使用IEOT扩展时,就变得没有必要了


查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 428 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信