gpt4 book ai didi

c - "git log -1 fullpath/myfile"与 libgit2

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:22 26 4
gpt4 key购买 nike

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

谢谢, pull 斯

最佳答案

Unfortunately git_tree_entry_byname seems not to work for files in subdirectories of the repo.

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

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

因此,您必须调用 git_tree_git_subtree检索您之后的条目的父树,然后调用 get_tree_entry_byname将父树传递给它。

I want to implement git log -1 fullpath/myfile with libgit2

如果你愿意检索哪个提交最后更新了一个文件,你可能想看看这个 answer它给出了一些关于文件历史主题和警告的通用提示。

I can't find any clue to get the commit in your linked answer.

您必须利用 revision walking API。

  • 可以找到该功能的描述 here .
  • A test展示不同的步行策略也可能为您提供一些帮助

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

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

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

关于c - "git log -1 fullpath/myfile"与 libgit2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com