如何检查当前分支是否是标签发布?

How do i check whether the curent branch is a tag release?

我正在尝试在 circleci 中实现自动化。为此,我需要检查 master 中的当前分支是否是标签发布。

git log -1 --pretty=%B | grep "Tag version release [0-9]\+\.[0-9]\+\.[0-9]_[0-9]\+\.[0-9]\+\.[0-9]\+"

使用上面的命令我可以读取日志。

但我需要的是标签: 提交 sld1kf3ja5ls6kj7gi8rogaeknvaerglreun (HEAD -> master, tag: v1.2.3_0.10.101, origin/master, origin/HEAD)

TL;DR:考虑使用 git tag --points-at,但要注意它的局限性。

根据定义,当前 b运行ch 绝不是 标签

在Git中,current b运行ch是special name[=16=中存储的b运行ch名称]. 运行 git checkout 或者,自 Git 2.23,git switch,允许您按名称选择 b运行ch 并将 b运行ch 设置为当前 b运行ch。要使 b运行ch B 成为 current b运行ch,Git 将:

  • 如有必要,用 b运行ch Btip 提交替换当前提交(或者什么都不做如果当前提交 is b运行ch B);1 的 tip comimt然后
  • 把b运行ch的名字写进名字HEAD.

所以现在,在git checkout mastergit checkout develop之后,当前的b运行chmasterdevelop,分别。当前 commit 是命名 b运行ch.

的最后一次提交

但是,如果您发出命令 git checkout v1.2.3_0.10.101 — 或等效的 git switch 命令 — 您请求的 name标记名称 而不是 b运行ch 名称 。 Git不会将标签名写入HEAD。相反,Git 将名称解析为提交哈希 ID。然后,Git 通过确保 HEAD 不再包含任何名称 来分离 HEAD。相反,Git 将:

  • 如有必要,用 selected 提交替换当前提交——和以前一样,如果 当前提交select ed 提交,这里不需要什么;然后
  • 原始提交哈希ID写入名称HEAD

结果是你根本不再在任何 b运行ch 上。

I need to check whether the current branch in master is a tag release or not.

current b运行ch in master这句简直毫无意义

每个提交都有一个唯一的哈希 ID(它永远不会是 sld1kf3j...,因为字母和数字的集合只包括 0-9a-f,所以它更像是 badf00dcafebabedeadbeef,但更长)。那个哈希 ID 意味着 提交,并且永远没有其他提交。

同时,每个name都有一个hash ID。多个名称可能持有相同的哈希 ID。因此,如果你在 b运行ch 上,因为你签出了一个,那么就有一个提交。如果你签出一个标签,有一个提交,但你不再在 b运行ch.

您可以检查当前提交是否也有一个或多个名称。例如,这就是 git log 中的装饰所做的。但是它可能有很多名字:

$ git log -1
commit <hash> (master, develop, feature, tag: v1.0, tag: beta)

这告诉你 当前提交 是给定的散列,并且有两个标签和三个 b运行ch 名称,所有这些都会 select 提交。这里缺少 HEAD -> 意味着虽然这是当前提交,但我们可能没有通过 b运行ch 名称 select 它。 (但是 git checkout --detach mastergit checkout --detach develop 会导致相同的情况,所以也许我们 did 使用 b运行ch 名称并简单地 使用了--detach选项。)

确保我们通过某些特定的 git checkoutgit switch 命令到达此特定提交的唯一真正可靠的方法是记住 git checkoutgit switch命令我们运行。如果您的系统这样做,请使用它。如果没有,就没有解决这个问题的可靠方法。2

但是,您可以检查一个或多个标记名称是否直接指向当前提交:

git tag --points-at HEAD
在上面的示例中,

会溢出两个名称 v1.0beta。请注意,即使我们通过 运行 git checkout master 到达这里,它也会执行此操作。

如果 git tag --points-at 打印 no 名称,则没有标记指向当前提交。

要判断 HEAD 现在是否包含 b运行ch 名称,请考虑使用:

git symbolic-ref HEAD

如果 HEAD 包含 b运行ch 名称,则打印 b运行ch 的全名:

$ git symbolic-ref HEAD
refs/heads/master

或如果 HEAD 分离则产生错误:

$ git checkout --detach master
[messages]
$ git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref

请注意,--points-at 是 Git 版本 1.7.10 中 git tag 的新功能,因此如果您的 Git 比这更早,则需要升级。


1替换当前提交步骤包括,实际上:

  • 从Git的索引和你的工作树中删除当前提交的文件,然后
  • 复制到 Git 的索引和您的工作树,来自 selected 提交的文件。

由于这个 "rip out all the files from commit X and insert all the files from commit Y instead" 操作,selected 提交现在是当前提交。请注意,git checkoutgit switch 都小心地只删除当前提交中 "cleanly saved" 的文件:如果这会丢失数据,则检出或切换将失败并出现错误。当然,您可以使用 -f / --force.

强制切换

2如果启用了引用日志,则引用日志包含您可能需要的大部分信息。但是指向方法可能更好。