c - 从提交中获取 blob?

标签 c git libgit2

我想弄清楚如何获得文件列表及其各自的新旧 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/

相关文章:

无法在函数调用中更改动态分配的数组值

c - 分拆 3 个线程的服务器程序

ruby - 使用 Rugged/libgit2 创建提交时如何更新工作目录?

git - 我可以有一个内存中的 git 存储库来使用 libgit2/ObjectiveGit 进行单元测试吗?

c - fprintf 和星号金字塔

c - 在 C 语言中,为什么数组的地址等于它的值?

git - Invoke-Expression,不是所有的输出都返回给变量

git - 从存储库中删除文件

git - 如何在 svn 中获取本地根路径?

cmake - 如何通过 cmake 包含 libgit2