默认启用 Git 提交 GPG 签名需配置 commit.gpgsign=true 并设置 user.signingkey 为有效密钥 ID,同时确保 GPG 环境就绪;GitHub/GitLab 验证依赖正确上传对应公钥。

怎么让 git commit 自动带 GPG 签名
默认情况下,git 不会签名提交,必须显式启用。关键是配置 commit.gpgsign 为 true,并确保本地有可用的 GPG 密钥和 gpg 命令在 $PATH 中。
- 运行
git config --global commit.gpgsign true开启全局自动签名 - 如果只对某个仓库生效,去掉
--global,在仓库根目录下执行 - 用
git config --get commit.gpgsign确认是否已设为true - 若提示
gpg failed to sign the data,大概率是 GPG agent 没启动、密钥过期,或私钥没导入到当前 GPG keyring
为什么 git commit -S 有时报错 no default secret key
这个错误说明 git 找不到默认用于签名的私钥——不是没装 GPG,而是没指定或没选中。
- 先用
gpg --list-secret-keys看列出的密钥 ID(一长串十六进制字符串,如ABC1234567890DEF) - 用
git config --global user.signingkey ABC1234567890DEF显式绑定 - 注意:密钥 ID 是
sec行末尾那一段,不是邮箱;如果用了子密钥,要用子密钥 ID(ssb行末尾) - 某些 Linux 发行版(如 Ubuntu 22.04+)默认用
gpg2,但 git 可能调用gpg,可加git config --global gpg.program gpg2对齐
GitHub / GitLab 怎么验证签名并显示 “Verified”
平台只校验签名本身有效性,并不联网查你密钥是否“可信”,所以关键是你上传的公钥必须匹配签名所用私钥,且未被吊销。
- 从
gpg --armor --export ABC1234567890DEF输出公钥内容(以-----BEGIN PGP PUBLIC KEY BLOCK-----开头) - GitHub:Settings → SSH and GPG keys → New GPG key;GitLab:Preferences → GPG Keys → Add key
- 提交后等 1–2 分钟再刷新页面,避免缓存导致仍显示 “Unverified”
- 如果 push 后仍不显示 Verified,用
git log --show-signature -1本地检查签名是否真成功;失败时会看到error: no signature found
CI 环境里签名失败怎么办
CI(如 GitHub Actions、GitLab CI)通常没交互式 GPG agent,也没私钥——这不是 bug,是设计使然:私钥不该进构建环境。
- 绝大多数 CI 场景下,**不要给自动化提交加 GPG 签名**;签名应由开发者本地完成,CI 只做验证(用
git verify-commit) - 若硬要签(比如发布脚本),需把私钥解密后注入 GPG keyring,但必须严格控制权限、用
gpg --import导入、禁用 passphrase(危险!) - 更安全的做法:用
git commit --no-gpg-sign覆盖全局设置,或 CI 中临时 unsetcommit.gpgsign - 注意:GitHub Actions 的
actions/checkout@v4默认 fetch depth=1,会导致git verify-commit失败,需加fetch-depth: 0
GPG 签名真正起作用的前提,是开发者自己保管好私钥、平台正确录入公钥、git 配置精准指向密钥 ID——三者缺一不可。最容易被忽略的是密钥 ID 写错(用了主密钥却配了子密钥 ID),或者以为装了 GPG 就万事大吉,结果根本没生成或导出过密钥。


















