小编典典

git 索引到底包含什么?

all

Git 索引究竟包含什么,我可以使用什么命令来查看索引的内容?


感谢您的所有回答。我知道索引充当了一个暂存区,并且提交的是索引而不是工作树。我只是对索引对象的组成感到好奇。我猜它可能是文件名/目录名列表、SHA-1
对、一种虚拟树?

在 Git 术语中,是否有任何 管道 命令可用于列出索引的内容?


阅读 143

收藏
2022-06-24

共1个答案

小编典典

Git book
包含一篇关于索引包含什么的文章:

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

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

Racy git 问题提供了有关该结构的更多详细信息:

索引是 git 中最重要的数据结构之一。
它通过记录路径列表及其对象名称来表示虚拟工作树状态,并用作暂存区以写出下一个要提交的树对象。
从某种意义上说,状态是“虚拟的”,它不一定必须而且通常不会匹配工作树中的文件。


2021 年 11 月:另见 Derrick Stolee
(Microsoft/GitHub)的“使用 Git 索引让你的 monorepo
感觉很小”
****

https://github.blog/wp-content/uploads/2021/11/Fig-1-working-directory-
index-commit-
history.png

Git 索引是 Git 中的一个关键数据结构。它充当文件系统上的文件和提交历史记录之间的“标记区域”。

  • 当您运行时git add,工作目录中的文件会被散列并作为对象存储在索引中,从而导致它们成为“标记更改”。
  • 当您运行git commit时,存储在索引中的暂存更改用于创建新的提交。
  • 当你运行时git checkout,Git 从提交中获取数据并将其写入工作目录和索引。

除了存储您的分阶段更改之外,索引还存储有关您的工作目录的文件系统信息。
这有助于 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。

如果索引是准备下一次提交的地方,为什么“ git ls-files -s”在提交后不返回任何内容?

因为 索引代表正在跟踪的内容 ,并且在提交之后,正在跟踪的内容与上次提交相同(git diff --cached不返回任何内容)。

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

该列表(跟踪的元素)使用提交的内容进行初始化。
当您切换分支时,索引内容会重置为您刚刚切换到的分支所引用的提交。


Git 2.20(2018 年第四季度)添加了 索引条目偏移表(IEOT)

请参阅Ben Peart (
)的提交
77ff112
提交
3255089
提交
abb4bb8
提交
c780b9c
提交
3b1d9e0
提交
371ed0d
(2018
年 10 月 10 日) 。 请参阅 Duy ( )的commit
252d079
(2018
年 9 月 26 日。(由Junio C Hamano 合并 –
--提交
e27bfaa
中,2018
年 10 月 19 日)benpeart
pclouds
gitster

ieot:添加索引条目偏移表 (IEOT) 扩展

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

它通过添加(可选)索引扩展来实现这一点,该扩展是索引文件中缓存条目块的偏移量表。

为了使这适用于 V4
索引,在写入缓存条目时,它会定期“重置”前缀压缩,方法是对当前条目进行编码,就好像前一个条目的路径名完全不同一样,并将该条目的偏移量保存在 IEOT .
基本上,使用 V4 索引,它会生成前缀压缩条目块的偏移量。


结果(使用 IEOT),提交
7bd9631
清理了read- cache.c load_cache_entries_threaded()Git 2.23(2019 年第三季度)的功能。

参见提交8373037提交D713E88提交D92349D提交113C29A提交C95FC72提交7A2A721提交C016579提交C016579提交BE27FB7,提交13A1781,提交7BD9631,提交7BD9631
提交3C1DCE8,COMP
c.1dce8,compors c.7ab d.7ab901 d.14 d.14 d.14 d.11
b.90
b
(
)。(由Junio C Hamano 合并 –
--提交
c0e78f7
中,2019
年 6 月 13
日)peff
gitster

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

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

在邮件列表中挖掘,该参数是该系列早期迭代的一部分,但当代码切换到使用
IEOT 扩展时变得不必要了。


在 Git 2.29(2020 年第四季度)中,格式描述会根据最近的 SHA-256 工作进行调整。

参见Martin 脜gren ( ) 的提交
8afa50a
提交
0756e61
提交
123712b
提交
5b6422a
(2020
年 8 月 15 日。(由Junio C Hamano
合并
——提交
74a395c
中,2020
年 8 月 19 日)none
gitster

[`index-

format.txt`](https://github.com/git/git/commit/123712ba41164146cd711dab6fe107b62d443f12):
文档 SHA-256 索引格式

签字人:Martin 脜gren

记录在 SHA-1 存储库中,我们使用 SHA-1,在 SHA-256 存储库中,我们使用
SHA-256,然后用更中性的东西替换“SHA-1”的所有其他用法。
避免提及“160 位”哈希值。

technical/index- format现在在其手册页中包含:

所有二进制数都按网络字节顺序排列。
在使用传统 SHA-1 的存储库中,下面提到的校验和和对象 ID(对象名称)都是使用 SHA-1 计算的。
同样,在 SHA-256 存储库中,这些值是使用 SHA-256 计算的。

除非另有说明,否则此处描述的是版本 2。

2022-06-24