我试图弄清楚如何为单个提交获取文件列表及其各自的新旧blob 。
假设您有提交 1 更改了 3 个文件。我会运行所述函数并返回 3 个文件以及它们的旧 blob 和新 blob(假设它们不是二进制文件)。
做到这一点的唯一方法是获取提交和先前的提交,解析它们的树,然后对树进行比较以找出不同之处,然后获取每个不同文件的 blob?
做到这一点的唯一方法是获取提交和先前的提交,解析它们的树,然后对树进行比较以找出不同之处,然后获取每个不同文件的 blob?
是的,这是推荐的方式。“旧”和“新”Tree
条目只是比较两个s时有意义的概念。
请注意,“旧”和“新”不是具有表现力的限定词。正如人们可以在diff 标头中看到的那样,一个条目的结果差异状态可能是
libgit2 tests-clar/diff/tree测试文件应该为您提供此功能的一些示例用法。
在 libgit2 问题跟踪器中提出了一个类似的问题(来自你?;-))。@arrbee 的答案也依赖于利用git_diff_tree_to_tree() API
.
考虑git show --raw v1.8.1^0
git 自己的存储库中的输出。
提交 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-GEN
在v1.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 的对象名称,请读取 的输出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 ...
仅使用 Git 命令,不知道访问此信息的特定 libgit2 函数,但您可能可以弄清楚。
您可以使用 获取在特定提交中更改了哪些文件的文件列表git show --stat COMMIT
。底部是已更改的文件路径列表(以及更改了多少行的详细信息)。您可能可以从那里过滤掉这些东西。您可以进一步使用漂亮格式从输出中删除更多内容。
获得文件路径后,您可以使用git show COMMIT:PATH
. 您可以使用git show COMMIT^:PATH
.