libgit2 - 将树对象写入 mysql odb 后端

libgit2 - write tree object to mysql odb backend

我按照 libgit2-backend 项目为 libgit2 ODB 后端创建 mysql 后端。

创建 blob 对象并将其放入 mysql 支持的 ODB 中相当容易,我正在使用 git_blob_create_frombuffer

但是当涉及到树等其他 ODB 对象时,就很难了。

据我从 libgit2 文档 101 示例和 API 参考资料中了解到,您可以使用 treebuilder 或索引编写树,但这两种方法都需要路径。 由于存储库是使用 git_repository_wrap_odb

创建的假存储库

我试过使用 'README.md' 这样的相对路径来构建树或索引,然后使用 git_treebuilder_write 或 git_index_write_tree_to,但都在路径验证时失败。

我想知道将树对象写入 mysql odb 后端的选项。

提前致谢!

示例代码:

git_odb_backend_mysql(odb_backend,"localhost", "git2", "git2", "git2", 0, NULL, 0);

git_odb_new(&odb_backend->odb);
git_repository_wrap_odb(&repo, odb_backend->odb);
git_odb_add_backend(odb_backend->odb, odb_backend, 1);

git_blob_create_frombuffer(&oid, repo, str, strlen(str));

git_treebuilder_new(&bld, repo, NULL);
git_treebuilder_insert(NULL, bld, "README.md", &oid, 0100644);   
git_treebuilder_write(&treeoid, repo, bld);

这是在 windows 7 32 位,visual studio 2013 桌面版 express

上测试的

Libgit2 版本:0.22.1

我把我的测试代码放到libgit2_clar

str 被写入 mysql:

select  lower(hex(oid)),type, size, convert(uncompress(data) using utf8)
from git2_odb;

oid                                       type size data
5dd01c177f5d7d1be5346a5bc18a569a7410c2ef  3    13   Hello, world! 

调用 git_treebuilder_insert

时出错

错误信息: libgit2_clar.exe 中 0x013A56A1 的未处理异常:0xC0000005:读取位置 0x00000000 的访问冲突。

Visual studio 调试停止在 libgit2/src/win32/path_w32.c,第 196 行

  if (path__is_absolute(src)) {

因为你得到一个 segfault/AV,它是 libgit2 中某处的错误。这最有可能来自于路径验证,以确保没有插入危险或无效的路径。这个 NULL 值的可能来源是存储库的路径,因为它被用作确定最终路径是否会尝试写入任何检查它的 gitdir 的方法。

您使用的构造函数仅用于读取数据数据库,而 AFAIK 从未作为一种写入方式进行过测试。我建议使用打开一个存储库,然后使用 git_repository_set_odb() 设置 odb 如果你确实想使用存储库接口来做某事。