使用libgit2的“git log -1 fullpath / myfile”

我想用libgit2实现git log -1 fullpath/myfile 。 我是libgit2的新手。 我是在正确的轨道上吗? 这是我到目前为止:

 git_repository_head(&refToHead, repo); headOID = git_reference_oid(refToHead); git_commit_lookup(&headCommit, repo, headOID); headTreeOID = git_commit_tree_oid(headCommit); git_tree_lookup(&tree, repo, headTreeOID); git_tree_entry_byname(tree, "repopath/myfile"); 

不幸的是, git_tree_entry_byname似乎不适用于repo的子目录中的文件。 任何的想法?

谢谢你,拉尔斯

不幸的是,git_tree_entry_byname似乎不适用于repo的子目录中的文件。

git_tree_entry_byname仅适用于紧接在传递树下的条目(树,blob和受支持的子模块)。

一个简单的解决方案就是依靠git_tree_get_subtree (参见测试 )来检索树中包含的最深子树,给出它的相对路径。 无论条目在树结构中有多深,这都可以工作。

因此,您必须调用git_tree_git_subtree来检索您所访问的条目的父树,然后调用get_tree_entry_byname将其传递给父树。

我想用libgit2实现git log -1 fullpath / myfile

如果您愿意检索最后更新文件的哪个提交,您可能需要查看此答案 ,该答案提供了有关文件历史记录主题和警告的一些通用提示。

我找不到任何线索来获得链接答案中的提交。

您必须利用revision walking API。

  • 可以在此处找到该function的描述。
  • 展示不同步行策略的测试也可能为您提供一些帮助

基本上,您必须从HEAD找到与您的filename匹配的树条目的oid 。 完成此操作后,您必须以递归方式遍历HEAD提交的父级,并且对于每个提交树,尝试识别以下两个更改之一。

  • 检测文件是否已重命名(树条目已从其父树中消失,在父树下弹出一个具有相同oid的新文件)
  • 检测文件的内容是否已更改(树条目仍然存在,其名称但其oid已更改)。

当你检测到一个,或者你没有更多的提交来处理时,立即从循环中退出。