我尝试了解如何在libgit2 中实现自定义对象数据库。作为主要的切入点,我已经签出所谓的例子库libgit2,后端为它实现的例子memcached,mysql,redis和sqlite3。
但我还是不明白如何将这些插入到 libgit2 中?我是否插入了 libgit2 可以加载的共享库?或者我是否使用相应的后端源从头开始编译 libgit2?这种后端的范围是什么?任何见解都非常感谢!
动机:默认情况下 git 和 libgit打包/压缩对象。就我而言,我想实现一个不这样做的后端。(是的,有 LFS,但我试图找到一个 libgit2-only 解决方案)
您可以使用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.