我可以在创建 git 标签后对其进行签名吗?

问题描述 投票:0回答:3

我创建了一个标签但忘记签名,然后将该标签推送到 GitHub。是否可以追溯签署该标签,还是必须创建一个新标签?

我已经阅读了

git tag
的手册页并用谷歌搜索了一下,但没有找到任何线索表明可以向现有标签添加签名。

git sign
3个回答
19
投票

不,你需要::

  • 用同名标签替换它:

      git tag <tag name> <tag name> -f -s
    
  • 但首先要设置提交者日期,以免更改日期

      set GIT_COMMITTER_DATE="$(git log -1 --format=%aD <tag_name>)"
    

正如mrts评论中添加的那样,因为标签已经被推送了:

您还需要使用 git push origin <tag_name> -f 强制推送

 
updated

标签

从 Git 2.42(2023 年第 3 季度)开始,您可以仅对需要它的标签进行签名,使用:

git for-each-ref --format='%(refname) %(signature)' refs/tags | python re-sign-tags.py
                                      ^^^^^^^^^^^^
                                   (new with Git 2.42)

还有

re-sign-tags.py

import sys
import subprocess

def verify_tag(refname, signature):
    grade = signature.split(":")[1]
    if grade == "good":
        print("Tag '%s' is signed with a good signature." % refname)
    else:
        print("Tag '%s' is signed with a bad signature." % refname)

def re_sign_tag(refname, signature):
    signer = signature.split(":")[1]
    print("Re-signing tag '%s' with key '%s'." % (refname, signer))
    subprocess.run(["git", "tag", "-f", refname, refname, "-s"], check=True)

if __name__ == "__main__":
    for refname, signature in sys.stdin:
        if refname.startswith("refs/tags/"):
            if verify_tag(refname, signature):
                re_sign_tag(refname, signature)

在 Git 2.42(2023 年第 3 季度)中,“

git for-each-ref
(man) 命令系列学习了与 GPG 签名验证相关的占位符。

请参阅 commit 26c9c03commit 2f36339(2023 年 6 月 4 日),作者:Kousik Sanagavarapu (

five-sh
)
(由 Junio C Hamano --
gitster
--
合并于 commit 81ebc54,2023 年 7 月 14 日)

ref-filter
:添加新的“签名”原子

合著者:Hariom Verma
合著者:Jaydeep Das
合著者:Nsengiyumva Wilberforce
指导者:Christian Couder
指导者:Hariom Verma
签署人:Kousik Sanagavarapu

复制用于输出签名及其其他参数的代码,以用于来自 Pretty 的 ref-filter 中的提交和标签。
将来,当 ref-filter 可以完成 Pretty 正在做的所有事情时,这将有助于摆脱这种逻辑的当前重复实现。

新的原子“签名”及其朋友相当于现有的漂亮格式,如下所示:

%(signature) = %GG
%(signature:grade) = %G?
%(siganture:signer) = %GS
%(signature:key) = %GK
%(signature:fingerprint) = %GF
%(signature:primarykeyfingerprint) = %GP
%(signature:trustlevel) = %GT

git for-each-ref
现在包含在其 手册页中:

signature

提交的 GPG 签名。

signature:grade

显示“G”表示良好(有效)签名,“B”表示不良签名 签名,“U”表示有效性未知的良好签名,“X” 对于已过期的良好签名,“Y”代表良好 由过期密钥生成的签名,“R”表示良好签名 由已撤销的密钥生成,如果无法签名,则为“E” 已检查(例如缺少密钥),“N”表示没有签名。

signature:signer

提交的 GPG 签名的签署者。

signature:key

提交的 GPG 签名的密钥。

signature:fingerprint

提交的 GPG 签名的指纹。

signature:primarykeyfingerprint

提交的 GPG 签名的主键指纹。

signature:trustlevel

提交的 GPG 签名的信任级别。可能的 输出为

ultimate
fully
marginal
never
undefined


4
投票

我知道这是一个老问题,但偏离了VonC所说的。我创建了一个单行 bash 脚本,它可以遍历存储库中的所有标签并自动对它们进行签名。您所要做的就是接受或更改旧标签中设置的消息。这是我想出的命令

git for-each-ref refs/tags | awk '{print $3}' | cut -c11- | xargs -I % sh -c 'git tag % % -f -s'

0
投票

这一行将签署您所有的本地标签并强制推送它们。同时,它会将标签的日期设置为它所附加的提交:

git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -s -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force

来源:这是 vmrob 的其他答案的修改版本,调整为当前问题。

© www.soinside.com 2019 - 2024. All rights reserved.