libgit2-newbie 问题:提交中的文件树中有什么?

libgit2-newbie question: What goes in the file tree in a commit?

tl;dr: libgit2-newbie 对编码提交中的索引感到困惑,最终决定忽略索引并只更新提交树。如有不妥请指教

这是一个(libgit2 新手)关于 git 内部结构的问题,使用 libgit2。我正在尝试编写一些代码来暂存文件并提交它,以便我可以推送它。为简单起见,假设我刚刚克隆了存储库,并且存储库中有几个文件。所以磁盘上的索引是空的。然后我将索引读入我的程序,将我的新文件添加到索引并使用索引提交更改(以先前的提交为父项)。这意味着我传递给提交的树中只有一个文件。但是,这会导致我所有其他文件都被删除。

我做错了什么?

我传递给提交的树应该包含所有文件(包括现有文件)还是只包含新文件?如果所有文件,我从哪里得到列表?我查看了 https://libgit2.org/docs/guides/101-samples/#commits 中的示例,但这并没有回答我的问题。

我的代码是用 Rust 编写的,所以除非有人需要,否则我不会告诉你细节。

编辑:好的,我进一步查看了文档。对于这个练习,我应该忽略索引吗?解决方案是使用 git_treebuilder_new()(对我来说更确切地说是 repo.treebuilder(Some(old_tree)))、使用树构建器添加我的新文件、构建新树并使用新树提交?...这似乎正在工作

索引的工作方式类似于构建 "filesystem image" 的某种石板,使用树对象作为路径信息,使用 blob 对象作为文件数据,可以使用散列作为地址将其序列化为一堆文件。至少在最初,每个对象都将作为单个文件存储在 .git/objects/ 下。一段时间后,ODB 将被打包(通常通过 git-gc),因此其中一些将被打包在一起,只有在那个时候才会涉及实际的增量,以将存储大小限制为最新版本一个文件加上它的所有 "ancestry" 二进制增量。

因此,您必须从另一个现有的树开始(通常通过查看 HEAD,它跟踪您的工作副本实际对应的内容,然后 "peeling" 它到树),或者通过一个空索引,在这种情况下,您将只输出您添加的数据,之前提交的所有其他文件都将消失(a.k.a。很多"deletes")。