1

我想git log -1 fullpath/myfile用 libgit2 来实现。我对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 子目录中的文件。任何的想法?

谢谢你,拉斯

4

1 回答 1

4

不幸的是 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 walkingAPI。

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

基本上,您必须从HEADoid您的filename. 完成此操作后,您必须递归地遍历HEAD提交的父节点,并且对于每个提交树,尝试识别以下两个更改之一。

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

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

于 2011-12-13T05:28:27.910 回答