我跟随libgit2-backend项目为libgit2 ODB后端创建mysql后端。

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

但是,当涉及到其他ODB对象(例如树)时,这很困难。

据我从libgit2文档101示例和API参考了解,您可以使用treebuilder或index来编写树,但是这两种方法都需要路径。
由于存储库是使用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)) {

最佳答案

由于您得到了段错误/ AV,因此它是libgit2内部某个错误。此路径最有可能来自路径验证,以确保未插入任何危险或无效路径。此NULL值可能来自存储库的路径,因为它被用作确定最终路径是否尝试写入gitdir的方式来进行检查。

您正在使用的构造函数只打算从dabatase中读出,而AFAIK从未经过过测试作为编写方式。如果您确实想使用存储库接口,则建议使用打开存储库,然后使用git_repository_set_odb()设置odb。

关于mysql - libgit2-将树对象写入mysql odb后端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28978460/

10-11 06:39