4

我试图弄清楚如何为单个提交获取文件列表及其各自的新旧blob 。

假设您有提交 1 更改了 3 个文件。我会运行所述函数并返回 3 个文件以及它们的旧 blob 和新 blob(假设它们不是二进制文件)。

做到这一点的唯一方法是获取提交和先前的提交,解析它们的树,然后对树进行比较以找出不同之处,然后获取每个不同文件的 blob?

4

3 回答 3

3

做到这一点的唯一方法是获取提交和先前的提交,解析它们的树,然后对树进行比较以找出不同之处,然后获取每个不同文件的 blob?

是的,这是推荐的方式。“旧”“新”Tree条目只是比较两个s时有意义的概念。

请注意,“旧”“新”不是具有表现力的限定词。正如人们可以在diff 标头中看到的那样,一个条目的结果差异状态可能是

  • 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, /** 条目是工作目录中的忽略项 */
  • GIT_DELTA_UNTRACKED = 7, /** 条目是工作目录中未跟踪的项目 */
  • GIT_DELTA_TYPECHANGE = 8, /** 条目类型在新旧之间改变 */

libgit2 tests-clar/diff/tree测试文件应该为您提供此功能的一些示例用法。

更新:

在 libgit2 问题跟踪器中提出了一个类似的问题(来自你?;-))。@arrbee 的答案也依赖于利用git_diff_tree_to_tree() API.

于 2013-01-13T21:43:40.797 回答
0

提取以前和当前版本的 SHA1

考虑git show --raw v1.8.1^0git 自己的存储库中的输出。

提交 5d417842efeafb6e109db7574196901c4e95d273
作者:Junio C Hamano
日期:2012 年 12 月 31 日星期一 14:24:22 -0800

    Git 1.8.1

    签字人:Junio C Hamano <gitster@pobox.com>

:100644 100644 fec1a06...d6f9555...M 文档/RelNotes/1.8.1.txt
:100644 100644 b0e8f02... 7a3f03b... M 文档/git.txt
:100755 100755 b2dffc8...72e37c9...M GIT-VERSION-GEN

最后三行表示随着该提交而更改的文件。更改行上的第一个 SHA1 是给定文件的先前修订版的对象名称,第二个是命名提交中的 blob。例如,GIT-VERSION-GENv1.8.1哈希中

$ git show v1.8.1^0:GIT-VERSION-GEN | git hash-object --stdin
72e37c9bfe3e897635f8c211569d9e6f5658a980

并且与其父提交关联的 blob 是

$ git show v1.8.1^0~:GIT-VERSION-GEN | git hash-object --stdin
b2dfc839f306123d544e8f536ee31a7574f1139

注意:git rev-parse解释的文档

作为特殊规则,<rev>^0表示提交本身,并且在<rev>引用提交对象的标记对象的对象名称时使用。

在这种情况下,v1.8.1^0表示标记所指的提交v1.8.1

获取提交中所有 blob 的 SHA1

要获取与给定提交关联的所有 blob 的对象名称,请读取 的输出git ls-tree,类似于

$ git ls-tree -r v1.8.1^0
100644 斑点 5e98806c6cc246acef5f539ae191710a0c06ad3f .gitattributes
100644 blob f702415c12c5a4a66180f7ffd697347e5343ac4a .gitignore
100644 blob c7e86183001a00ad2105765708b5b59852ef6640 .mailmap
100644 blob 536e55524db72bd2acf175208aef4f3dfc148d42 正在复制
100644 blob ddb030137d54ef3fb0ee01d973ec5cee4bb2b2b3 文档/.gitattributes
100644 blob d62aebd848b2a44f977ad4d7c4b75b6ff72b2163 文档/.gitignore
100644 blob 69f7e9b76c3f9b87b7951fb0df6a9720edadeb3e 文档/编码指南
100644 blob e53d333e5c08515af1e21d81c7daa365b12609a1 文档/生成文件
100644 blob fea3f9935b7794ce86f04d22c9d68fb9d537167d 文档/RelNotes/1.5.0.1.txt
100644 blob b061e50ff05b5e13211bb315e240974e898de32c 文档/RelNotes/1.5.0.2.txt
...
于 2013-01-14T02:42:07.270 回答
-1

仅使用 Git 命令,不知道访问此信息的特定 libgit2 函数,但您可能可以弄清楚。

您可以使用 获取在特定提交中更改了哪些文件的文件列表git show --stat COMMIT。底部是已更改的文件路径列表(以及更改了多少行的详细信息)。您可能可以从那里过滤掉这些东西。您可以进一步使用漂亮格式从输出中删除更多内容。

获得文件路径后,您可以使用git show COMMIT:PATH. 您可以使用git show COMMIT^:PATH.

于 2013-01-13T21:54:00.920 回答