C++ Git树显示未跟踪的文件

C++ Git树显示未跟踪的文件,c++,git,libgit2,C++,Git,Libgit2,我正在尝试解决此问题: 问题是模型中使用的树不包含任何未跟踪的文件,因此视图没有任何可显示的内容。当我在文件上暂存时,它会显示出来 有没有办法在树中同时跟踪未跟踪的文件 我创建了一个小的测试应用程序来发现问题。暂存一个文件时,计数不等于零,否则它始终为零 测试设置 包含以下未跟踪文件的新git存储库(TestRepository): testfile.txt testfolder/testfile2.txt d #包括 #包括 int main(){ git_libgit2_init(

我正在尝试解决此问题:

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

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

我创建了一个小的测试应用程序来发现问题。暂存一个文件时,计数不等于零,否则它始终为零

测试设置

  • 包含以下未跟踪文件的新git存储库(TestRepository):
    • testfile.txt
    • testfolder/testfile2.txt
d

#包括
#包括
int main(){
git_libgit2_init();
git_repository*repo=NULL;
int error=git_repository_open(&repo,“/TestRepository”);
如果(错误<0){
常量git_error*e=git_error_last();
printf(“错误%d/%d:%s\n”,错误,e->klass,e->message);
退出(错误);
}
git_tree*tree=nullptr;
git_index*idx=nullptr;
git_存储库_索引(&idx,repo);
git_oid id;
if(git_索引_写入_树(&id,idx)){
常量git_error*e=git_error_last();
printf(“错误%d/%d:%s\n”,错误,e->klass,e->message);
退出(错误);
}
git_tree_查找(&tree、repo和&id);
int count=git_tree_entrycount(tree);
printf(“%d”,计数);
无git(回购);
printf(“成功”);
返回0;
}

如果我理解正确,您看到的是正常的:由于文件未跟踪/是新的,索引不知道它,因此如果您询问索引,它没有要比较的“阶段性”更改,因此没有差异

如果您想为一个尚未被跟踪的文件提供一个diff,那么您必须以另一种方式提供它,通常是让
git_diff
来比较工作树版本与
/dev/null
、空blob等

由于您想要的是libgit2解决方案,所以我在GitX中尝试的方法是通过
git\u status\u list\u new
API,它提供了一种与文件系统无关的方式,使用
git\u patch\u from\u blobs
/
git\u patch\u from\u blobs\u和\u buffer
动态生成可查看的差异(分段和未分段)。现在回想起来,也许它应该作为
git\u status\u entry\u generate\u patch
或其他东西存在于库中

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