Git дерево показывает неотслеживаемые файлы - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь решить эту проблему: https://github.com/gitahead/gitahead/issues/380

Проблема состоит в том, что дерево, используемое в модели, не содержит неотслеживаемых файлов, и поэтому в представлении нечего отображать , Когда я запускаю файл, он показывается.

Есть ли способ отслеживать в дереве также неотслеживаемые файлы?

Я создал небольшое тестовое приложение, чтобы найти проблему. Когда один файл подготовлен, количество не равно нулю, в противном случае оно всегда равно нулю.

Testsetup

  • new git хранилище (TestRepository) с следующие неотслеживаемые файлы:
    • testfile.txt
    • testfolder / testfile2.txt

d

#include <git2.h>
#include <stdio.h>

int main() {

    git_libgit2_init();

    git_repository *repo = NULL;
    int error = git_repository_open(&repo, "/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_tree *tree = nullptr;
    git_index* idx = nullptr;
    git_repository_index(&idx, repo);

    git_oid id;
    if (git_index_write_tree(&id, idx)) {
        const git_error *e = git_error_last();
        printf("Error %d/%d: %s\n", error, e->klass, e->message);
        exit(error);
    }

    git_tree_lookup(&tree, repo, &id);

    int count = git_tree_entrycount(tree);
    printf("%d", count);


    git_repository_free(repo);

    printf("SUCCESS");

    return 0;
}

1 Ответ

0 голосов
/ 02 мая 2020

Если я правильно понял, то, что вы видите, нормально: поскольку файл не отслежен / новый, индекс не знает об этом, поэтому, если вы спросите индекс, у него не будет «поэтапных» изменений для сравнения, следовательно, нет diff.

Если вы хотите использовать diff для еще не отслеживаемого файла, вам придется предоставить его другим способом, обычно, попросив git_diff выполнить сравнение версии рабочего дерева. с /dev/null, пустым блобом и т. д. c.

Поскольку вы работаете с решением libgit2, я пытаюсь сделать это в GitX через API git_status_list_new, который дает несколько независимый от файловой системы способ генерации обоих видимых различий (поэтапных и неустановленных) на лету, используя git_patch_from_blobs / git_patch_from_blobs_and_buffer. Оглядываясь назад, может быть, это должно жить в библиотеке как git_status_entry_generate_patch или как-то ...

...