问题描述
我尝试了解如何在 libgit2 中实现自定义对象数据库。作为主要入口点,我已经检查了名为 libgit2-backends 的示例存储库,它实现了 memcached
、MysqL
、redis
和 sqlite3
的示例。
但我还是不明白如何将这些插入到 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
。