首页 > 解决方案 > libgit2-newbie 问题:提交中的文件树中有什么?

问题描述

tl; dr:libgit2-newbie 对编码提交中的索引感到困惑,最终决定忽略索引并仅更新提交树。如果这是错误的,请告知。

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

我究竟做错了什么?

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

我的代码是用 Rust 编写的,所以除非有人需要,否则我不会详细说明。

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

标签: gitlibgit2git-index

解决方案


索引就像某种石板来构建“文件系统映像”,使用树对象获取路径信息,使用 blob 对象获取文件数据,可以使用哈希作为地址将其序列化为一堆文件。至少在最初,每个对象都将作为单个文件存储在.git/objects/. 一段时间后,ODB 将被打包(通常通过 git-gc),因此其中一些将打包在一起,并且只有在那个时候才会涉及实际的 deltas,以将存储大小限制为文件的最新版本加上它所有的“祖先”二进制增量。

因此,您必须从另一个现有的树开始(通常通过查看 HEAD,它跟踪您的工作副本实际对应的内容,并将其“剥离”到树),或者通过空索引,在这种情况下,您'只会输出你添加的数据,而之前提交的所有其他文件都将消失(也就是很多“删除”)。


推荐阅读