我正在尝试与libgit2合并,并且在执行remote_fetch或create_annotated_commit之后执行git_repository_free时,我总是会点击此断言
但是我不知道我做错了什么?并且没有生成libgit错误。而且我也不明白这个断言的含义。
典型的调用堆栈如下:
2 __GI_abort abort.c 90 0x7f35da541f5d
3 __assert_fail_base assert.c 92 0x7f35da537f17
4 __GI___assert_fail assert.c 101 0x7f35da537fc2
5 git_mwindow_put_pack mwindow.c 106 0x7f35db69725f
6 pack_backend__free odb_pack.c 565 0x7f35db6a3dda
7 odb_free odb.c 679 0x7f35db69d5c4
8 git_odb_free odb.c 696 0x7f35db69d67c
9 set_odb repository.c 95 0x7f35db6d40c3
10 git_repository__cleanup repository.c 150 0x7f35db6d42a3
11 git_repository_free repository.c 161 0x7f35db6d42da
12 GitEngine::~GitEngine GitEngine.cpp 268 0x556a9e4f067d
13 main main.cpp 24 0x556a9e4eed8e
要重现此问题,我只需要这样做:
git_remote *remote;
int err = git_remote_create(&remote, m_repo, "remotefetch", "./repoD/");
git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT;
if (err) {
qDebug() << "error";
}
err = git_remote_fetch(remote, nullptr, &fetch_opts, nullptr);
if (err) {
qDebug() << "error";
}
if (m_repo) //this is in the destructor
git_repository_free(m_repo);
如果我将git_remote_create替换为git_remote_create_anonymous,问题将消失。
但是,带有git_remote_create_anonymous的事件,如果稍后在git_repository_free之前调用git_annotated_commit_from_fetchhead,我将再次命中相同的断言。我不知道为什么?我用命令行检查了git存储库,合并似乎正确执行了。
答案 0 :(得分:1)
当库本身已经处置了其内部全局状态时,有时会发生这种情况,该状态由git_libgit2_init
配置并由git_libgit2_shutdown
破坏。
在调用任何libgit2函数之前,您必须 调用git_libgit2_init
。完成后,您应该呼叫git_libgit2_shutdown
。 (尽管如果您只是关闭应用程序,则不必这样做,操作系统将关闭所有打开的资源。)
但是,在调用git_libgit2_shutdown
之后,您绝不能调用任何libgit2函数。这样做将尝试引用释放的资源。您的堆栈跟踪提示您在调用git_libgit2_shutdown
之前先调用git_repository_free
。
如果您颠倒了这些呼叫的顺序,那么一切都会好起来的。