Git index 文件(.git/index)是一个二进制文件,如果直接打开会看到全是乱码。我们可以使用 hexdump 命令
以十六进制方式来查看该文件的内容:
git ls-files -s 命令可以把 index 文件的内容以友好的方式显示出来。注意,在 Git 中 index、stage、cache是相同的东西。
解析
便于解析此处提供一张 ASCII 码表
index 文件的结构如下图:
地址:https://git-scm.com/docs/index-format
下边的解析都是在该文件的基础上。
index 头部数据格式
签名 [4-byte]
对照上边的 ASCII 表,知道 44 49 52 43 分别对应{ 'D' 'I' 'R' 'C' } 。意思是 dircache,目录缓存。是 index 文件的标识,类似于 Java 字节码文件的 CAFEBABE,所有的 index 文件都以它开头,用于标识该 index 文件是否是合法文件。
版本 [4-byte]
00 00 00 02,说明 index 文件的版本为 2。截止到 Git 版本 2.31.1 ,支持的版本为 2, 3,4。
条目数量 [4-byte]
00 00 00 01,为32位无符号整数,标识了暂存区中文件的数目。此处为 1,说明有一个文件。
在这 12 字节头部之后是 n 个索引条目的列表,其中 n 与索引头部的条目数量匹配。Git 根据‘路径/文件名’字段以升序对索引条目进行排序。
*此处待完善*:对应上图的 20-byte 的部分,但我们当前研究的 index 文件不包含这部分。
A number of sorted index entries (see below).
Extensions
Hash checksum over the content of the index file before this checksum.
index 条目数据格式
文件创建时间 [8-byte]
60 86 5e 2c 1f f3 19 d2,前 4 个字节为,自 1970-01-0100:00:00 起经过的秒数;后 4 个字节为以秒为单位的,创建时间的纳秒分量。‘60 86 5e 2c’ ,对应的日期为 2021-04-26 14:31:08,距 1970-01-0100:00:00 年 1619418668(十进制)。
文件修改时间 [8-byte]
60 86 5e 2c 1f f3 19 d2,解析同上。
接下来为与文件关联的元数据-这些元数据源自Unix OS上使用的文件属性。
device [4-byte]
01 00 00 06
inode [4-byte]
02 27 4e 28
mode [4-byte]
00 00 81 a4,文件模式,
user id [4-byte]
00 00 01 f5,使用 id -u 来查看。此处为 501(十进制)。
group id [4-byte]
00 00 00 14,使用 id -g 来查看。此处为 20(十进制)。
size [4-byte]
00 00 00 04,文件内容的字节数。我们可以使用 ls -la 来查看。
SHA1 [20-byte]
19 0a 18 03 7c 64 c4 3e 6b 11 48 9d f4 bf 0b 9e b6 d2 c9 bf,该 SHA-1 值指向对应的 Blob 对象。使用 git ls-files -s 来查看暂存区内容。我们可以使用 git cat-file -p/-t,来查看 Git 对象的内容或者类型。此处为 ‘123’ 和 ‘blob’。
Flags位 [2-byte]
00 07,要显示成二进制位,从高比特位到低比特位依次为:0000 0000 0000 0111
1 bit:假定有效/假定不变的标志,0 表示跟踪所有变更,1 表示忽略所有变更。
1 bit:扩展标志(对于小于 3 的版本,必须为0;如果为1,则在‘路径/文件名’之前附加 2 个字节)
2 bit:合并阶段标志,该标识用于在合并分支的时候使用。普通(未合并)文件通常为0。
12 bit:‘路径/文件名’的长度,最长支持到4095位(0xFFF
),溢出部分将被忽视。
Flags位 [2-byte]
6e 75,要显示成二进制位,从高比特位到低比特位依次为:
1 bit: 保留位,未来使用。
1 bit: skip-worktree标志(用于稀疏签出)。
1 bit: intent-to-add flag (git add -N)
13 bit: unused, must be zero
可变长度 [*-byte]
path / file name,文件目录长度可变,不固定。
参考地址:https://docs.microsoft.com/en-us/archive/msdn-magazine/2017/august/devops-git-internals-architecture-and-index-files