Git 树显示未跟踪的文件

Git tree show untracked files

我正在尝试解决这个问题: https://github.com/gitahead/gitahead/issues/380

问题是模型中使用的树不包含任何未跟踪的文件,因此视图没有任何内容可显示。当我在文件上显示它时。

有没有办法在树中跟踪未跟踪的文件?

我创建了一个小型测试应用程序来查找问题。暂存一个文件时,count不为0,否则一直为0。

测试设置

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;
}

如果我没理解错,你看到的是正常的:因为文件是 untracked/new,索引不知道它,所以如果你问索引,它没有 "staged" 更改以进行比较,因此没有差异。

如果你想要一个尚未被跟踪的文件的差异,你必须以另一种方式提供它,通常是要求 git_diff 完成工作树版本与 /dev/null、空 blob 等

因为你在寻找 libgit2 解决方案,我在 GitX 中尝试这样做的方式是通过 git_status_list_new API,它提供了一种与文件系统无关的方式来生成两者使用 git_patch_from_blobs/git_patch_from_blobs_and_buffer 即时查看差异(已上演和未上演)。回想起来,也许它应该以 git_status_entry_generate_patch 之类的形式存在于图书馆中……