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

Dan*_*ens 6 git libgit2

我尝试了解如何在libgit2 中实现自定义对象数据库。作为主要的切入点,我已经签出所谓的例子库libgit2,后端为它实现的例子memcachedmysqlredissqlite3

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

动机:默认情况下 git 和 libgit打包/压缩对象。就我而言,我想实现一个不这样做的后端。(是的,有 LFS,但我试图找到一个 libgit2-only 解决方案)

J. *_*old 5

您可以使用git_odb_open. 它是官方libgit2 API的一部分。

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

/**
 * 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
 */
Run Code Online (Sandbox Code Playgroud)

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

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