Git 索引究竟包含什么,我可以使用什么命令来查看索引的内容?
感谢您的所有回答。我知道索引充当了一个暂存区,并且提交的是索引而不是工作树。我只是对索引对象的组成感到好奇。我猜它可能是文件名/目录名列表、SHA-1 对、一种虚拟树?
在 Git 术语中,是否有任何 管道 命令可用于列出索引的内容?
Git book 包含一篇关于索引包含什么的文章:
索引是一个二进制文件(通常保存在 中.git/index),其中包含一个排序的路径名列表,每个路径名都有权限和 blob 对象的 SHA1;git ls-files可以显示索引的内容:
.git/index
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 感觉很小” ****
Git 索引是 Git 中的一个关键数据结构。它充当文件系统上的文件和提交历史记录之间的“标记区域”。 当您运行时git add,工作目录中的文件会被散列并作为对象存储在索引中,从而导致它们成为“标记更改”。 当您运行git commit时,存储在索引中的暂存更改用于创建新的提交。 当你运行时git checkout,Git 从提交中获取数据并将其写入工作目录和索引。 除了存储您的分阶段更改之外,索引还存储有关您的工作目录的文件系统信息。 这有助于 Git 更快地报告更改的文件。
Git 索引是 Git 中的一个关键数据结构。它充当文件系统上的文件和提交历史记录之间的“标记区域”。
git add
git commit
git checkout
除了存储您的分阶段更改之外,索引还存储有关您的工作目录的文件系统信息。 这有助于 Git 更快地报告更改的文件。
要了解更多信息,请参阅。“ git/git/Documentation/technical/index- format.txt ”:
所有二进制数都按网络字节顺序排列。除非另有说明,否则此处描述的是 版本 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”在提交后不返回任何内容?
所有二进制数都按网络字节顺序排列。除非另有说明,否则此处描述的是 版本 2 。
D
I
R
C
dircache
A
Z
如果索引是准备下一次提交的地方,为什么“ git ls-files -s”在提交后不返回任何内容?
git ls-files -s
因为 索引代表正在跟踪的内容 ,并且在提交之后,正在跟踪的内容与上次提交相同(git diff --cached不返回任何内容)。
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
benpeart
pclouds
gitster
ieot:添加索引条目偏移表 (IEOT) 扩展 该补丁通过向索引添加额外数据来解决加载索引的 CPU 成本问题,这将使我们能够高效地多线程加载和转换缓存条目。 它通过添加(可选)索引扩展来实现这一点,该扩展是索引文件中缓存条目块的偏移量表。 为了使这适用于 V4 索引,在写入缓存条目时,它会定期“重置”前缀压缩,方法是对当前条目进行编码,就好像前一个条目的路径名完全不同一样,并将该条目的偏移量保存在 IEOT . 基本上,使用 V4 索引,它会生成前缀压缩条目块的偏移量。
该补丁通过向索引添加额外数据来解决加载索引的 CPU 成本问题,这将使我们能够高效地多线程加载和转换缓存条目。
它通过添加(可选)索引扩展来实现这一点,该扩展是索引文件中缓存条目块的偏移量表。
为了使这适用于 V4 索引,在写入缓存条目时,它会定期“重置”前缀压缩,方法是对当前条目进行编码,就好像前一个条目的路径名完全不同一样,并将该条目的偏移量保存在 IEOT . 基本上,使用 V4 索引,它会生成前缀压缩条目块的偏移量。
结果(使用 IEOT),提交 7bd9631清理了read- cache.c load_cache_entries_threaded()Git 2.23(2019 年第三季度)的功能。
read- cache.c load_cache_entries_threaded()
参见提交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
peff
读取缓存:从线程加载中删除未使用的参数 该load_cache_entries_threaded()函数接受一个src_offset它不使用的参数。这自77ff112成立以来就一直存在(read- cache:在工作线程上加载缓存条目,2018-10-10,Git v2.20.0-rc0)。 在邮件列表中挖掘,该参数是该系列早期迭代的一部分,但当代码切换到使用 IEOT 扩展时变得不必要了。
该load_cache_entries_threaded()函数接受一个src_offset它不使用的参数。这自77ff112成立以来就一直存在(read- cache:在工作线程上加载缓存条目,2018-10-10,Git v2.20.0-rc0)。
load_cache_entries_threaded()
src_offset
read- cache
在邮件列表中挖掘,该参数是该系列早期迭代的一部分,但当代码切换到使用 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
none
[`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 位”哈希值。
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现在在其手册页中包含:
technical/index- format
所有二进制数都按网络字节顺序排列。 在使用传统 SHA-1 的存储库中,下面提到的校验和和对象 ID(对象名称)都是使用 SHA-1 计算的。 同样,在 SHA-256 存储库中,这些值是使用 SHA-256 计算的。 除非另有说明,否则此处描述的是版本 2。
所有二进制数都按网络字节顺序排列。 在使用传统 SHA-1 的存储库中,下面提到的校验和和对象 ID(对象名称)都是使用 SHA-1 计算的。 同样,在 SHA-256 存储库中,这些值是使用 SHA-256 计算的。
除非另有说明,否则此处描述的是版本 2。