git无法直接检查远程分支提交签名状态,必须先fetch再用git verify-commit或github api验证;后者返回的verified字段才与网页端“verified”一致。

Git 本身不提供直接命令检查远程分支上每个提交的签名状态——git log 或 git show 只能验证本地已获取的提交对象是否带有效签名,但不会自动联网去比对远程仓库当前 HEAD 的签名有效性。真正能确认“远程分支最新提交是否已验证”,必须结合本地公钥配置 + 本地 fetch 后的手动或脚本化验证。
git log --show-signature 只验本地对象,不查远程实时状态
很多人误以为运行 git log --show-signature origin/main 就能反映 GitHub 上显示的 “Verified” 状态,其实不是。git log --show-signature 仅用你本地已配置的 GPG/SSH 公钥去解密并校验 commit 对象里的 gpgsig 或 signatures 字段。它完全不访问远程服务器,也不感知 GitHub 是否已将该密钥加入账户、是否启用了警戒模式。
- 如果本地没导入对应公钥,哪怕远程是 Verified,也会显示
gpg: Signature made ... using RSA key ... gpg: Can't check signature: No public key - 如果本地公钥过期或被撤销,而 GitHub 仍接受旧签名(因验证记录持久化),
git log可能报gpg: Signature expired,但 GitHub 页面仍标 Verified - 该命令无法识别 SSH 签名——Git CLI 目前只原生支持 GPG 验证,SSH 签名需靠 GitHub UI 或 API 判断
检查远程分支签名必须先 fetch,再逐提交验证
要确认某远程分支(如 origin/main)当前 tip 是否签名有效,流程固定为三步:fetch → 检查 commit hash → 验证签名。缺一不可。
-
git fetch origin main:确保本地有最新 commit 对象(不是只更新 ref,而是下载对象体,含签名字段) -
git show -s --format='%H %G?' origin/main:输出哈希和签名状态码,G表示 good(有效),U表示 untrusted(公钥未信任),N表示 none(未签名),E表示 error(损坏或格式错) - 若结果是
G,再补查一次git show -s --format='%GK' origin/main看密钥 ID,确认是否为你预期的那把
注意:%G? 不会告诉你为什么失败,只给单字母反馈;想定位原因得搭配 git verify-commit <hash></hash>,它会输出完整 GPG 错误信息(比如 “key expired 2025-12-01”)。
抓取指定 GitHub用户的 Stars 项目,生成标准化中文 Markdown 报告。用户提及「分析 GitHub stars」「导出收藏项目」「汇总 GitHub 星标」「生成 stars 报告」或粘贴含 ?tab=stars 的链接时触发。执行通过 bash...
GitHub API 是唯一能查远程实时验证状态的方式
Git 命令行看不到 GitHub 最终认定的 “Verified / Partially verified / Unverified” 状态,因为那是服务端基于账户设置(如警戒模式)、密钥绑定邮箱、S/MIME 策略等综合判断的结果。只有 GitHub API 能返回这个字段:
- 请求
GET /repos/{owner}/{repo}/commits/{ref}(例如main),响应中.commit.verification.verified是布尔值,.commit.verification.reason给出详情(valid、invalid、no_user等) - 需要认证 token(
read:public_key权限足够),否则返回reason: "unsigned"即使实际已签名 - CLI 中可快速试:
curl -H "Authorization: token YOUR_TOKEN" https://api.github.com/repos/OWNER/REPO/commits/main | jq '.commit.verification'
这个 API 返回的状态,才和你在 GitHub 网页上点击 “Verified” 弹窗看到的内容完全一致。
容易忽略的关键点:签名 ≠ 提交者身份真实
即使 git verify-commit 返回 success,也不能直接推断“这个提交真是张三本人操作的”。原因有二:
- GPG/SSH 私钥可能已被导出并泄露,攻击者只要拿到私钥就能伪造任意签名提交
- 提交的
author和committer邮箱字段仍是明文,可被任意设置;GitHub 只校验签名密钥是否绑定到该邮箱(且邮箱已验证),不校验操作人是否登录了对应账号
所以,真正的安全闭环必须同时满足:SSH 认证控制推送权限 + GPG/SSH 提交签名保证内容来源 + GitHub 账户邮箱验证 + (可选)警戒模式强制所有提交签名。少一环,历史就可能被静默篡改。










