如何在 Git snapshpt 指针结构中表示多文件夹提交

How would multi folder commit be represented in a Git snapshpt pointer structure

如何在 Git 中表示多文件夹结构?

在 Pro-git 一书中的“Branches in a Nutshell”一章中,您会看到这张图片:

这张图片完美地展示了什么是单文件夹快照。我们可以将快照视为几个文件:提交文件、树文件和几个文本文件。

提交文件

作为名称(地址)的提交文件,字符串作者(值 scott),sting 提交者(值:Scott)和指向另一个文件地址的指针,该地址描述了提交的树结构。

树文件

文件存储一个数字 (int),在这种情况下告诉您树的大小,它会告诉您树中有 3 个文件。然后这个树文件存储地址到提交(blobs)中的每个文件存储。

Blob 文件

blob 文件将有一个名称(地址)并包含我们在其中写入的文本。可以是代码、网络文章或书籍章节。

不清楚

树文件(蓝色)是否有指向子树(另一个蓝色方块)的指针和地址?或者树结构的所有信息都将以某种方式存储在单个树文件中。

下图是我想象的具有多个文件夹的提交结构的样子,这是正确的表示吗?如果不正确,有人可以解释一下它是如何完成的吗?

在图像中可以看到这将是一个文件夹:92ec2,其中包含 3 个文件:5b1d3、911e7、cba0a。然后在 92ec2 中会有一个文件夹,地址为 ef25b,里面有 2 个文件:3d4a5, a54fg.

我们可以看到文件夹 92ec2 有指向文件夹 ef25b 的指针。每个文件夹将指向其所有子文件夹。

Note: I used a methaphor of files but I understand C pointers and memory allocation and I assume the implementation is using C pointers or something similar. Size in the tree would be in bits and you would need to divide it by the side of the blob structure to get the "value 3". I Also understand that Some times the tree may point to previous snapshot of the a file if it was not modified since the last commit.

让我们一探究竟。这是一个由两个文件组成的文件夹和一个本身包含两个文件的文件夹:

-rw-r--r--   1 mattmobile  staff     0 Oct  2 14:17 a
-rw-r--r--   1 mattmobile  staff     0 Oct  2 14:17 b
drwxr-xr-x   4 mattmobile  staff   128 Oct  2 14:17 myFolder

./myFolder:
-rw-r--r--  1 mattmobile  staff    0 Oct  2 14:17 c
-rw-r--r--  1 mattmobile  staff    0 Oct  2 14:17 d

好的,让我们把这个文件夹置于Git控制之下,添加所有文件,然后提交。现在让我们检查一下那个提交:

% git ls-tree main
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    b
040000 tree 592be6b15ea6d7060cfcc646a780253c2e7b20d7    myFolder
% git ls-tree 592be6
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    c
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    d