почему я нажимаю assert в libgit2 при выполнении удаленной выборки - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь реализовать слияние с 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_annotated_commit_from_fetchhead позже, до того же самого git_repository будет возвращен, так же, как и git_repository.Я не имею понятия почему?Я проверил репозиторий git с помощью командной строки, слияние, казалось, было выполнено правильно.

1 Ответ

0 голосов
/ 29 января 2019

Это может иногда происходить, когда сама библиотека избавилась от своего внутреннего глобального состояния, которое настроено на git_libgit2_init и уничтожено с помощью git_libgit2_shutdown.

Вы должны позвонить git_libgit2_init перед вызовом любых функций libgit2.Вы должны позвонить git_libgit2_shutdown, когда вы закончите.(Хотя если вы просто закрываете свое приложение, вам не обязательно делать это, любые открытые ресурсы будут закрыты операционной системой.)

Однако вы не должны вызывать какие-либоФункции libgit2 после вызова git_libgit2_shutdown.Это будет пытаться ссылаться на освобожденные ресурсы.Ваша трассировка стека предполагает, что вы звоните git_libgit2_shutdown перед вызовом git_repository_free.

Если вы измените порядок этих вызовов, то все должно быть в порядке.

...