如何检查当前分支是否是标签发布?
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 B 的 tip 提交替换当前提交(或者什么都不做如果当前提交 is b运行ch B);1 的 tip comimt然后
- 把b运行ch的名字写进名字
HEAD
.
所以现在,在git checkout master
或git checkout develop
之后,当前的b运行ch是master
或develop
,分别。当前 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-9
和 a-f
,所以它更像是 badf00d
或 cafebabe
或 deadbeef
,但更长)。那个哈希 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 master
或 git checkout --detach develop
会导致相同的情况,所以也许我们 did 使用 b运行ch 名称并简单地 也使用了--detach
选项。)
确保我们通过某些特定的 git checkout
或 git switch
命令到达此特定提交的唯一真正可靠的方法是记住 git checkout
或 git switch
命令我们运行。如果您的系统这样做,请使用它。如果没有,就没有解决这个问题的可靠方法。2
但是,您可以检查一个或多个标记名称是否直接指向当前提交:
git tag --points-at HEAD
在上面的示例中, 会溢出两个名称 v1.0
和 beta
。请注意,即使我们通过 运行 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 checkout
和 git switch
都小心地只删除当前提交中 "cleanly saved" 的文件:如果这会丢失数据,则检出或切换将失败并出现错误。当然,您可以使用 -f
/ --force
.
强制切换
2如果启用了引用日志,则引用日志包含您可能需要的大部分信息。但是指向方法可能更好。
我正在尝试在 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 B 的 tip 提交替换当前提交(或者什么都不做如果当前提交 is b运行ch B);1 的 tip comimt然后
- 把b运行ch的名字写进名字
HEAD
.
所以现在,在git checkout master
或git checkout develop
之后,当前的b运行ch是master
或develop
,分别。当前 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-9
和 a-f
,所以它更像是 badf00d
或 cafebabe
或 deadbeef
,但更长)。那个哈希 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 master
或 git checkout --detach develop
会导致相同的情况,所以也许我们 did 使用 b运行ch 名称并简单地 也使用了--detach
选项。)
确保我们通过某些特定的 git checkout
或 git switch
命令到达此特定提交的唯一真正可靠的方法是记住 git checkout
或 git switch
命令我们运行。如果您的系统这样做,请使用它。如果没有,就没有解决这个问题的可靠方法。2
但是,您可以检查一个或多个标记名称是否直接指向当前提交:
git tag --points-at HEAD
在上面的示例中, 会溢出两个名称 v1.0
和 beta
。请注意,即使我们通过 运行 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 checkout
和 git switch
都小心地只删除当前提交中 "cleanly saved" 的文件:如果这会丢失数据,则检出或切换将失败并出现错误。当然,您可以使用 -f
/ --force
.
2如果启用了引用日志,则引用日志包含您可能需要的大部分信息。但是指向方法可能更好。