我试图找出如何获得一个文件列表以及它们各自的新旧
blobs用于单个提交.
假设您已提交1更改了3个文件.我会运行所述函数并返回3个文件以及它们的旧blob和新blob(假设它们不是二进制文件).
执行此操作的唯一方法是获取提交和先前的提交,解析它们的树,然后在树上执行diff以找出不同的内容,然后为每个不同的文件获取blob?
最佳答案
Would the only way to do this be get the commit and previous commit, resolve their trees, then do a diff on the trees to find out what is different, and then get the blob for every different file?
是的,这是推荐的方式. “旧”和“新”条目只是比较两棵树时有意义的概念.
要注意“旧”和“新”不是那些富有表现力的限定词.正如人们可以在diff header中看到的那样,条目的差异状态可能是
> GIT_DELTA_UNMODIFIED = 0,/ **无变化* /
> GIT_DELTA_ADDED = 1,旧版本中不存在/ **条目* /
> GIT_DELTA_DELETED = 2,新版本中不存在/ **条目* /
> GIT_DELTA_MODIFIED = 3,/ **新旧之间的条目内容发生了变化* /
> GIT_DELTA_RENAMED = 4,/ **条目在新旧之间重命名* /
> GIT_DELTA_COPIED = 5,/ **条目是从另一个旧条目复制的* /
> GIT_DELTA_IGNORED = 6,/ **条目被忽略workdir中的项目* /
> GIT_DELTA_UNTRACKED = 7,/ **条目是workdir中未跟踪的项目* /
> GIT_DELTA_TYPECHANGE = 8,/ **新旧之间的条目类型更改* /
libgit2 tests-clar/diff/tree测试文件应该为您提供此功能的一些示例用法.
更新:
在libgit2问题跟踪器中已经提出了similar question(来自你?;-)). @arrbee的答案还依赖于利用git_diff_tree_to_tree()API.