我想弄清楚如何获得文件列表及其各自的新旧 blobs对于单个提交。
假设您有一个提交 1,它更改了 3 个文件。我将运行所述函数并返回 3 个文件及其旧 blob 和新 blob(假设它们不是二进制文件)。
执行此操作的唯一方法是获取提交和之前的提交,解析它们的树,然后对树进行比较以找出不同之处,然后为每个不同的文件获取 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?
是的,这是推荐的方式。 “旧” 和"new" 条目只是比较两个 Tree
时有意义的概念。
请注意,“旧” 和"new" 不是那种富有表现力的限定词。正如人们可以在 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 测试文件应该为您提供此功能的一些示例用法。
更新:
A similar question (来自你?;-) )已在 libgit2 问题跟踪器中提出。 @arrbee 的回答还依赖于利用 git_diff_tree_to_tree() API
。
关于c - 从提交中获取 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14308260/