在git中的带注释标签中输入`commit`

时间:2017-05-08 23:35:16

标签: git git-tag

使用git cat-file -p <hash-of-tag>在git中回显带注释的标记会产生如下内容:

object <sha1-hash>
type commit
tag 0.0.1
tagger My Name (...)

Description of tag
在我的情况下,

object指向一个提交对象。 type commit意味着必定不是必须的。是否存在注释标签未指向提交的情况?

2 个答案:

答案 0 :(得分:4)

是:带注释的标记对象可以指向另一个带注释的标记对象,甚至可以直接指向树或blob。这些都是相当罕见的。

git rev-parse命令 - 真的,Git一般; rev-parse只是例程的面向用户的界面 - 具有&#34;剥离&#34;的概念。标记,甚至是提交,以达到特定的目标对象类型。例如,如果要查看附加到提交或标记或散列ID的树:

git rev-parse whatever^{tree}

whatever 部分转换为任何部分,然后尝试向下钻取&#34;到了我们得到树对象的程度。如果 whatever 是带注释的标记,则会反复跟随标记到其对象,直到它到达非标记,根据定义,它是提交,树或blob:

  • 如果我们到了一棵树,我们就完成了。
  • 如果我们已经达到提交,则每个提交都有一个顶级树,因此我们提取该提交树。
  • 如果我们已经到达blob,则找不到树,所以命令(无论是git rev-parse还是git diff或{{1} })错误。

git diff-tree这样的命令希望git diff-tree自动将您提供的参数转换为树,就像添加了<tree-ish>后缀一样。正如您所料,还有^{tree}^{commit}个后缀。还有一个^{blob}后缀,它只是验证某些内容确实是一个标记(因为没有其他对象类型可以解析一个标记),并且有一个^{tag}后缀表示&#34;将标签解析为其对象&#34;,即剥离所有带注释的标签,然后获取剩余的任何对象。

the gitrevisions documentation中描述了完整规则。请注意,并非每个Git命令的行为都如上所述:特别是,^{}尝试在遵循gitrevisions中的六步过程之前将其参数视为分支名称。这意味着,如果名称git checkout可以是标记分支,foo会找到分支(即,检出{{1 }}),但git checkout foo显示解析标记的结果

答案 1 :(得分:0)

是的,您可以通过将其哈希或其他引用方式传递给git tag来标记任何git对象。

除了committree(提交中引用的目录列表),blob(树中引用的文件内容)甚至是{{ 1}}也可能出现在标签中。