如何查找提交的相应树哈希值和blob哈希值?

3

我正在学习Git,知道每个提交指向一个树形结构,而树形结构又指向相应的blob(s)。在执行git提交时,我可以看到提交ID被生成。但是如何找到与提交相关联的相应树哈希和blob(s)哈希呢?

谢谢您的回复。

4个回答

6
你可以使用git cat-file -p查看不同类型的对象。

git-cat-file-提供版本库对象的内容、类型和大小信息
...
-p
根据其类型对<object>的内容进行漂亮打印。

以下是一个示例。

在我的版本库中,最上面的提交是这个:

❯ git lg -1
* 87ffcaa: (7 weeks ago) Updated all packages (HEAD -> develop, origin/develop)
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Tue, 16 Jun 2020 12:30:21 +0200)

为了查看该提交的内容,我可以执行以下操作:
❯ git cat-file -p 87ffcaa
tree dedfc8120583a89936cacf2e55c5db1d6d532129
parent def5a89a442d0ec88243a43ca9c9fef493dbf4c6
author Lasse Vågsæther Karlsen <lasse@vkarlsen.no> 1592303421 +0200
committer Lasse Vågsæther Karlsen <lasse@vkarlsen.no> 1592303421 +0200

Updated all packages

现在,如果我想查看它所参考的树:
❯ git cat-file -p dedfc8120583a89936cacf2e55c5db1d6d532129
100644 blob 9a277a1791951e14c235243bcf374ee2d01e27b9    .editorconfig
100644 blob 1ff0c423042b46cb1d617b81efb715defbe8054d    .gitattributes
100644 blob 304b515a2ae6795ef7c73c6f0d1e822fcefd66b3    .gitignore
040000 tree 74fd33ec96af2b083e9367448bd6f6786e8b4d47    ConsoleSandbox
100644 blob e47b11709137791b3c1241092b3d5215df834ad3    LICENSE
100644 blob 2f2aaad1b5662e3d3e33398c6ce29106d0fbdcac    LVK.sln
100644 blob 9ec3d74ae05f906457f6a60ffa2df78a070ffabb    LVK.sln.DotSettings
100644 blob a1f9a1de838feeec888ab34bf35a998ade9c3560    README.md
040000 tree 759ef337f68ec31f0ca035f9427f309e87765030    SolutionQualityAssuranceTests
...

如果我想查看其中一个实际的blob,比如那个LICENSE文件:

❯ git cat-file -p e47b11709137791b3c1241092b3d5215df834ad3
MIT License

Copyright (c) 2018 Lasse Vågsæther Karlsen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
...

你也可以使用这种方法查看子文件夹。上面的目录树中还有下面这行:
040000 tree 408c62b058b6f4b14f65188d492ec452f0bb6e1d    src

这是一个子文件夹。我可以通过相同的方式展示引用它的树形结构:

❯ git cat-file -p 408c62b058b6f4b14f65188d492ec452f0bb6e1d
100644 blob af6a33f6fe9f8f35d7d070fa16be01319df801bd    Directory.Build.props
040000 tree 9a8adfce1ccb494689fd6710369c1f925fa8acbf    LVK.AppCore.Console
040000 tree 4054753cad506b9a0132c72becd906b388bc8e59    LVK.AppCore.Windows.Forms
...

等等。


1
你能否在其中添加 git ls-treegit ls-files?它们对于递归列表非常有用,例如 git ls-tree -rd @: 是整个树形结构的良好概览。 - jthill

3
希望这可以帮助您:
blob——用于存储单个文件内容的对象。
tree——包含对其他 blob 或子树对象的引用的对象。
commit——包含对另一个 tree 对象的引用的对象。
提交对象引用指向树对象,树对象引用 blob 或其他子树对象。
- 提交树视图 git log --graph --oneline --all - 显示各种类型的对象(blobs、trees、tags 和 commits) git show <object> - 列出给定树对象的内容 git ls-tree <object> - 查看提交对象的内容和类型(在您的例子中为 COMMIT) git cat-file -p <SHA_OF_ COMMIT_OBJECT>

3
要查找任何修订表达式解决为什么确切的哈希,请使用git rev-parse。其名称提示了它的完整目的,作为用于扩展Git命令的完整选项和参数解析工具包。
请参阅git revisions,以了解您可以指定解析为Git标识符的所有方法。
有很多种方法,因为Git的底层结构(除了文字之外)非常简单,但是可以使用它来完成开发工作的事情数量是无限的,并且令人眼花缭乱,有很多便利措施可以使支持特定工作流程更加方便。
如果somecommit指的是提交或标记,则somecommit:引用(标记)提交的树,如同在检查中可能会错过基本的那些场合一样,somecommit^{tree}也是如此。
后面的通常是“让我到达一个树”的语法(前导是“让我到达索引”)。
要列出树,请使用git ls-tree。例如,git ls-tree -rd @:可以快速概述结构。
要列出索引,请使用git ls-files,其中有很多方便的选项,它基本上是具有索引感知文件列表的瑞士军刀,或者可能只是我有点言过其实。
因此,如果somecommit:path/to/file是该提交在该路径处列出的任何内容,则::path/to/file是在该路径处列出的索引中的任何内容。还有更多,请参见该链接。
由于somecommit:命名了某个提交的树,因此git rev-parse somecommit:将向您显示其ID;:path/to/file命名该路径的索引条目,git rev-parse :path/to/file将向您显示¹该条目中的内容ID。
¹对于正在进行的合并,Git保留三个条目,每个条目都有基本内容,我们自己的内容和它们的内容,因此您和您的工具(包括Git自己的自动合并)可以检查差异,最终添加正确的结果并更新主索引条目。 Git相当晦涩地称这些为“阶段”,您可以明确地引用它们,例如1: path/to/file,并对2和3采取类似的做法。主要条目是阶段0。

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接