libgit2-newbie问题:提交时文件树中包含什么?

问题描述 投票:1回答:1

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

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

我在做什么错?

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

我的代码在Rust中,所以除非有人想要,否则我将为您保留详细信息。

edit:好的,我对文档进行了进一步的研究。索引是我应该忽略的红色鲱鱼吗?是使用git_treebuilder_new()(或更确切地说是repo.treebuilder(Some(old_tree))),使用树构建器添加我的新文件,构建新树并使用新树进行提交的解决方案?...似乎有效了

git libgit2 git-index
1个回答
1
投票

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

因此,您必须从另一棵现有的树开始(通常是通过查看HEAD,它会跟踪您的工作副本实际对应的内容,然后将其“剥离”到树上),或者通过一个空索引,在其中如果您只输出已添加的数据,并且上一次提交的所有其他文件都将消失(也就是很多“删除”)。

© www.soinside.com 2019 - 2024. All rights reserved.