【问题标题】:In Git, how can two hashes point to one commit?在 Git 中,两个哈希值如何指向一个提交?
【发布时间】:2021-02-04 12:53:26
【问题描述】:

我有一些脚本可以查询我们的主机 (Gitlab) 以获取项目的所有标签以及标签指向的提交哈希。然后它对这些哈希做更多的工作。

这通常有效,但我有一个提交,我得到的哈希值与该提交上的 git log 显示的哈希值不同。

问题是,这并不完全是错误的。返回的哈希确实让我检查了正确的提交:

>>git checkout 6a923
HEAD is now at ae67e044

>>git log -1 6a923
commit ae67e044359c86781fd7c1b74016f858f00584f8 (HEAD, tag: <correct tag>)

但是当我以后想做比较哈希之类的事情时,它显然不起作用。

我认为哈希是独一无二的。这似乎是某种别名哈希。这是怎么回事?

附加信息:

>>git cat-file -p 6a923
object ae67e044359c86781fd7c1b74016f858f00584f8
type commit
tag <correct tag>
tagger <correct tagger> 1558448485 -0400

【问题讨论】:

  • 只是为了确定一下,您是否有一个名为 6a923 的标签?
  • 我没有。所有标签都以字母或“1”开头
  • 我也想问同样的问题。也可以是分支名称。
  • git log -1 6a923 说什么?
  • 在问题中向我们展示以下输出:git cat-file -p 6a923

标签: git hash


【解决方案1】:

6a923 只是一个带注释的标签,它指向修订版ae67e04435https://git-scm.com/book/en/v2/Git-Basics-Tagging

【讨论】:

  • 没错。 git cat-file -p 6a923 的输出暗示它是一个标签。如果你发出git cat-file -t 6a923,它应该打印tag。但是这个结果与 OP 的声明相矛盾,声称它不是标签名称。然而,它看起来好像是。
  • 这是正确的答案。谢谢! @kriegaex 这与我的说法并不矛盾。它不是标签名称。它是注释标签的哈希值。我不知道带注释的标签,我绝对不知道它们有自己的哈希值。
  • 是的,当然是注释标签的哈希值。您应该可以看到通过ls -l .git/objects/6a/923* 表示标签的对象,并且能够通过ZLIB 解压缩它,基本上您应该看到与cat-file 几乎相同,只是以tag &lt;length&gt;\0 开头左右。
  • 您可以通过 Perl 脚本使用以下 3 行代码来验证我的最后一条语句:#!/bin/bashFILE="$1"perl -MCompress::Zlib -e 'undef $/; print uncompress(&lt;&gt;)' &lt; "$FILE"。将其保存为git-deflate.sh 并运行./git-deflate.sh .git/objects/6a/923...(全名)。
  • 顺便说一句,带注释的标签必须有自己的带有哈希的对象,因为它们需要能够像提交一样存储 cmets。我的 Git 有点生锈了,但现在又回来了。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2013-09-11
  • 2010-12-24
  • 2010-10-31
  • 2019-01-04
  • 2017-09-09
  • 2023-03-16
相关资源
最近更新 更多