如何将自定义对象数据库添加到 libgit2?

问题描述

我尝试了解如何在 libgit2 中实现自定义对象数据库。作为主要入口点,我已经检查了名为 libgit2-backends 的示例存储库,它实现了 memcachedMysqLredissqlite3 的示例。

但我还是不明白如何将这些插入到 libgit2 中?我是否插入了 libgit2 可以加载的共享库?或者我是否使用相应的后端源从头开始编译 libgit2?这种后端的范围是什么?任何见解都非常感谢!

动机:认情况下 git 和 libgit packs/compresses 对象。就我而言,我想实现一个不这样做的后端。 (是的,有 LFS,但我试图找到一个只使用 libgit2 的解决方案)

解决方法

您可以使用 git_odb_open 实现这一目标。这是官方 libgit2 API 的一部分。

基本上,git_odb_open “[c]reate[s] 一个新的对象数据库并自动添加 [s] 两个默认后端”(引用自 here) .如果您查看ligbit2 GitHub repository,您可以在GIT_EXTERN(int) git_odb_open(git_odb **out,const char *objects_dir); 中找到odb.h(通常,我建议查看所有odb functions)。总之,函数下方的注释非常有用:

/**
 * Add a custom backend to an existing Object DB
 *
 * The backends are checked in relative ordering,based on the
 * value of the `priority` parameter.
 *
 * Read <odb_backends.h> for more information.
 *
 * @param odb database to add the backend to
 * @param backend pointer to a git_odb_backend instance
 * @param priority Value for ordering the backends queue
 * @return 0 on success; error code otherwise
 */

有点遗憾的是,这些注释没有包含在标准文档中。无论如何,在这里您可以看到重要的 @param 用于指向实例本身的后端指针。稍微跑题一下,我建议您也查看一下 odb_backend.h 的代码(幸运的是,ligbit2 有很好的文档记录)。

顺便说一句(为了完整起见),我应该提到您也可以通过 git_odb_add_backend 将自定义后端插入到已经存在的 odb 中(显然您也获得了指针),尽管它需要您有一个现有的数据库开始。如果您正在寻找为现有后端添加替代方案,即在您的情况下不压缩对象的替代方案,您可以选择 git_odb_add_alternate