我可以在创建一个git标签后签名吗?

x33g5p2x  于 2023-08-01  发布在  Git
关注(0)|答案(2)|浏览(127)

我创建了一个标签,忘记了签名,然后把标签推到了GitHub。是否可以追溯地对该标记进行签名,或者我必须创建一个新的标记?
我已经阅读了git tag的手册页,并在谷歌上搜索了一下,但没有发现向现有标记添加签名是可能的。

j8yoct9x

j8yoct9x1#

不,您需要:

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强制推送更新 * 标签
从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年第三季度)中,“git for-each-ref”(man)系列命令学习了与GPG签名验证相关的占位符。
参见commit 26c9c03commit 2f36339(2023年6月4日)by Kousik Sanagavarapu ( five-sh )
(由Junio C Hamano -- gitster --合并于commit 81ebc54,2023年7月14日)

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

共同撰写人:哈里翁·维尔马
共同撰写人:杰迪普·达斯
共同撰写人:恩森吉尤姆瓦·威尔伯福斯
指导人:克里斯蒂安·库德
指导人:哈里翁·维尔马
签收人:库西克·萨纳加瓦拉普
复制pretty中的ref-filter中用于输出commits和tags的签名和其他参数的代码。
在未来,这将有助于摆脱当前到处都是这种逻辑的重复实现,当ref-filter可以做pretty正在做的一切时。
新的atom“签名”及其朋友相当于现有的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签名的信任级别。可能的输出为ultimatefullymarginalneverundefined

gv8xihay

gv8xihay2#

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

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

字符串

相关问题