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