libgit2 不是 return 有效的 blob
libgit2 does not return a valid blob
我正在尝试使用 libgit2 获取存储库的 blob:
#include <git2.h>
#include <stdio.h>
int main() {
git_libgit2_init();
git_repository *repo = NULL;
int error = git_repository_open(&repo, "/home/martin/Dokumente/TestRepository");
if (error < 0) {
const git_error *e = git_error_last();
printf("Error %d/%d: %s\n", error, e->klass, e->message);
exit(error);
}
git_diff *diff = NULL;
git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
opts.flags |= GIT_DIFF_IGNORE_WHITESPACE;
opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED;
error = git_diff_index_to_workdir(&diff, repo, NULL, &opts);
if (error < 0) {
const git_error *e = git_error_last();
printf("Error %d/%d: %s\n", error, e->klass, e->message);
exit(error);
}
git_patch* patch = nullptr;
git_patch_from_diff(&patch, diff, 0);
bool oldFile = false;
const git_diff_delta *dd = git_patch_get_delta(patch);
const git_oid &id = (!oldFile) ? dd->new_file.id : dd->old_file.id;
git_object *obj = nullptr;
git_object_lookup(&obj, repo, &id, GIT_OBJECT_ANY);
git_blob* blob = reinterpret_cast<git_blob *>(obj);
const char* pointer = (const char*)git_blob_rawcontent(blob);
// cleanup
git_object_free(obj);
git_patch_free(patch);
git_diff_free(diff);
git_repository_free(repo);
return 0;
}
存储库
创建新存储库
提交如下文件:
1
2个
3个
4
再次删除 4,但不要提交
让程序运行
预计:
程序 运行 没问题。
观察:
obj 执行后仍然是 nullptr
git_object_lookup()
将变量 oldFile 设置为 true 时,程序 运行 正常并且指针 "pointer" 包含原始 blob。
有人知道为什么我没有从 git_object_lookup() 返回有效对象吗?
当您区分索引和工作目录时,增量的 new
一侧表示工作目录中的文件。它的 id
是磁盘上文件的哈希值。除非您通过其他方式将该 blob 显式插入到存储库的对象存储中,否则它还没有理由存在。
问题是您正在尝试获取 ID 为 dd->new_file.id
的对象。该文件位于工作目录中,因为它尚未添加或提交。这意味着它还不在存储库中。当您 运行 git_object_lookup()
时,它找不到该对象,因为它尚未添加到树中。 OID 不对应任何匹配项,因此它 returns 为空。
如果要获取当前工作目录数据,必须先使用git_blob_create_from_workdir
在树中创建对象,然后在尝试访问它时才能找到它。所以您的新代码可能如下所示:
bool oldFile = false;
const git_diff_delta *dd = git_patch_get_delta(patch);
git_oid id;
if (!oldFile) {
error = git_blob_create_from_workdir(&id, repo, dd->new_file.path);
if (error < 0) {
const git_error *e = git_error_last();
printf("Error %d/%d: %s\n", error, e->klass, e->message);
exit(error);
}
} else {
id = dd->old_file.id;
}
git_object *obj = nullptr;
git_object_lookup(&obj, repo, &id, GIT_OBJECT_ANY);
git_blob* blob = reinterpret_cast<git_blob *>(obj);
const char* pointer = (const char*)git_blob_rawcontent(blob);
我正在尝试使用 libgit2 获取存储库的 blob:
#include <git2.h>
#include <stdio.h>
int main() {
git_libgit2_init();
git_repository *repo = NULL;
int error = git_repository_open(&repo, "/home/martin/Dokumente/TestRepository");
if (error < 0) {
const git_error *e = git_error_last();
printf("Error %d/%d: %s\n", error, e->klass, e->message);
exit(error);
}
git_diff *diff = NULL;
git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
opts.flags |= GIT_DIFF_IGNORE_WHITESPACE;
opts.flags |= GIT_DIFF_INCLUDE_UNTRACKED;
error = git_diff_index_to_workdir(&diff, repo, NULL, &opts);
if (error < 0) {
const git_error *e = git_error_last();
printf("Error %d/%d: %s\n", error, e->klass, e->message);
exit(error);
}
git_patch* patch = nullptr;
git_patch_from_diff(&patch, diff, 0);
bool oldFile = false;
const git_diff_delta *dd = git_patch_get_delta(patch);
const git_oid &id = (!oldFile) ? dd->new_file.id : dd->old_file.id;
git_object *obj = nullptr;
git_object_lookup(&obj, repo, &id, GIT_OBJECT_ANY);
git_blob* blob = reinterpret_cast<git_blob *>(obj);
const char* pointer = (const char*)git_blob_rawcontent(blob);
// cleanup
git_object_free(obj);
git_patch_free(patch);
git_diff_free(diff);
git_repository_free(repo);
return 0;
}
存储库
创建新存储库
提交如下文件:
1 2个 3个 4
再次删除 4,但不要提交
让程序运行
预计: 程序 运行 没问题。
观察: obj 执行后仍然是 nullptr git_object_lookup()
将变量 oldFile 设置为 true 时,程序 运行 正常并且指针 "pointer" 包含原始 blob。
有人知道为什么我没有从 git_object_lookup() 返回有效对象吗?
当您区分索引和工作目录时,增量的 new
一侧表示工作目录中的文件。它的 id
是磁盘上文件的哈希值。除非您通过其他方式将该 blob 显式插入到存储库的对象存储中,否则它还没有理由存在。
问题是您正在尝试获取 ID 为 dd->new_file.id
的对象。该文件位于工作目录中,因为它尚未添加或提交。这意味着它还不在存储库中。当您 运行 git_object_lookup()
时,它找不到该对象,因为它尚未添加到树中。 OID 不对应任何匹配项,因此它 returns 为空。
如果要获取当前工作目录数据,必须先使用git_blob_create_from_workdir
在树中创建对象,然后在尝试访问它时才能找到它。所以您的新代码可能如下所示:
bool oldFile = false;
const git_diff_delta *dd = git_patch_get_delta(patch);
git_oid id;
if (!oldFile) {
error = git_blob_create_from_workdir(&id, repo, dd->new_file.path);
if (error < 0) {
const git_error *e = git_error_last();
printf("Error %d/%d: %s\n", error, e->klass, e->message);
exit(error);
}
} else {
id = dd->old_file.id;
}
git_object *obj = nullptr;
git_object_lookup(&obj, repo, &id, GIT_OBJECT_ANY);
git_blob* blob = reinterpret_cast<git_blob *>(obj);
const char* pointer = (const char*)git_blob_rawcontent(blob);