使用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已更改)。
当你检测到一个,或者你没有更多的提交来处理时,立即从循环中退出。