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



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

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

我做错了什么?

我传递以提交的树应该包含所有文件(包括现有文件(还是仅包含新文件?如果是所有文件,我从哪里获取列表?我已经看过 https://libgit2.org/docs/guides/101-samples/#commits 的例子,但这并没有回答我的问题。

我的代码是 Rust 的,所以除非有人想要,否则我会省略细节。

编辑:好的,我已经进一步查看了文档。该指数是我应该在本练习中忽略的红鲱鱼吗?是使用git_treebuilder_new()(或者更确切地说是repo.treebuilder(Some(old_tree)),对我来说(,使用树生成器添加我的新文件,构建新树并使用新树提交的解决方案?...这似乎正在起作用

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

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

相关内容

最新更新