【问题标题】:"git log -1 fullpath/myfile" with libgit2带有 libgit2 的“git log -1 fullpath/myfile”
【发布时间】:2011-12-12 22:37:35
【问题描述】:

我想用 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 子目录中的文件。有什么想法吗?

谢谢你, 拉尔斯

【问题讨论】:

    标签: c git git-log libgit2


    【解决方案1】:

    不幸的是 git_tree_entry_byname 似乎不适用于 repo 的子目录。

    git_tree_entry_byname 仅适用于直接在传递的树下的条目(树、blob 和子模块(如果支持)。

    您的问题的一个简单解决方案是依靠 git_tree_get_subtree(请参阅tests)在给定相对路径的情况下检索树中包含的最深子树。无论条目在树结构中的深度如何,这都会起作用。

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

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

    如果您愿意检索上次更新文件的提交,您可能需要查看answer,它提供了有关文件历史主题和注意事项的一些通用提示。

    我在您的链接答案中找不到任何线索。

    您必须利用 revision walking API。

    • 功能描述见here
    • test 演示不同的步行策略也可以为您提供一些帮助

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

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

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

    【讨论】:

    • 谢谢! get_tree_entry_byname 现在可以工作了。但是,我在您的链接答案中找不到任何线索来获得提交。请再给我一个提示好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2013-09-23
    • 1970-01-01
    • 2015-09-19
    • 2014-10-27
    • 2021-12-18
    • 2018-08-08
    相关资源
    最近更新 更多