为什么你的 Git 提交需要签名?—— Git Commit Signing 完全指南

在参与开源项目(如 Tauri)或对安全性有要求的团队开发中,你可能会遇到这样的情况:提交的代码在 GitHub 上显示为 "Unverified"(未验证),甚至因为没有签名而被禁止合并。

这篇博客将带你深入了解 Git 提交签名的必要性,并手把手教你如何使用 SSH 密钥配置最简单的签名流程。

1. 为什么我们需要提交签名?(The Why)

很多开发者认为,我在 git config 里设置了 user.nameuser.email,不就已经证明了"这是我提交的"吗?

答案是:不能。

Git 的"天真"与安全隐患

Git 在设计之初是非常信任使用者的。你可以在任何一台机器上,把提交者的名字和邮箱设置成任何人。 比如,我可以轻易地用 Linus Torvalds 的名字和邮箱提交一段包含恶意后门的代码。如果这段代码被合并了,看起来就像是 Linux 之父本人提交的一样。

签名的作用

数字签名(GPG 或 SSH 签名)解决了这个问题。它类似于现实生活中的**"亲笔签名"+"防伪印章"**。

  1. 身份验证 (Identity):只有拥有私钥的你,才能签出这个名。GitHub 通过你上传的公钥验证签名,确认"这确实是你本人提交的"。
  2. 完整性 (Integrity):签名还能确保提交内容在传输过程中没有被篡改。
  3. 项目合规:许多大型开源项目(Tauri, Kubernetes 等)为了防止供应链攻击,强制开启了"分支保护规则",要求所有合并的 Commits 必须是 Verified(已验证)的。

2. 如何配置?(The How)

以前大家常用 GPG Key 进行签名,但配置繁琐且容易出错。现在 Git 和 GitHub 都支持使用 SSH Key 进行签名,这使得配置变得异常简单!

我们直接复用你用于拉取代码的 SSH Key 即可。

第一步:准备 SSH Key

如果你还没有 SSH Key,或者想用现有的(推荐算法为 ed25519):

bash 复制代码
# 检查现有的 SSH keys
ls -al ~/.ssh/

# 如果没有,生成一个新的 (一直回车即可)
ssh-keygen -t ed25519 -C "your_email@example.com"

第二步:告诉 Git 使用 SSH 签名

在你的终端中运行以下命令。你可以选择 --global (全局生效,推荐) 或 --local (仅当前仓库生效)。

bash 复制代码
# 1. 告诉 Git 我们要用 SSH 格式来签名 (默认是 gpg)
git config --global gpg.format ssh

# 2. 指定你的 SSH 公钥路径 (注意是 .pub 结尾的文件)
git config --global user.signingkey ~/.ssh/id_ed25519.pub

# 3. 开启自动签名 (关键步骤!开启后以后提交都不用加参数了)
git config --global commit.gpgsign true

第三步:在 GitHub 上添加 Signing Key

这是最容易被忽略的一步!Git 签好了名,GitHub 得有你的"公钥备案"才能验证。

  1. 复制你的公钥内容:

    bash 复制代码
    cat ~/.ssh/id_ed25519.pub
  2. 打开 GitHub SSH and GPG keys 设置页面

  3. 点击 New SSH key

  4. 关键点 :在 Key type 下拉菜单中,必须选择 Signing Key (默认是 Authentication Key)。

  5. 粘贴公钥并保存。


3. 怎么使用?(The Usage)

配置完成后,使用起来是完全透明的。

日常提交

你不需要改变任何习惯。

bash 复制代码
git commit -m "feat: add amazing feature"

由于我们配置了 commit.gpgsign true,Git 会在后台自动调用 SSH Key 对这次提交进行加密签名。

验证签名

你可以通过以下方式检查是否成功:

在本地:

bash 复制代码
git log --show-signature

你会看到类似 Good "git" signature for ... 的提示。

在 GitHub 上:

提交推送到 GitHub 后,你的 Commit 旁边会出现一个绿色的 Verified 徽章。


4. 常见问题 (FAQ)

Q: 为什么我配置了,GitHub 还是显示 Unverified? A: 检查两点:

  1. GitHub 上添加 SSH Key 时,Type 选对了吗?必须是 Signing Key
  2. 你的 Git user.email 和 GitHub 账号的主邮箱一致吗?签名验证是绑定邮箱的。

Q: 我有多个电脑怎么办? A: 每台电脑生成自己的 SSH Key,并分别添加到 GitHub 的 Signing Keys 中即可。

Q: 我之前的提交没有签名,怎么办? A: 你可以使用 rebase 来重新签名过去的提交(注意:这会修改提交 Hash,只能在未合并的分支上操作):

bash 复制代码
git rebase -i HEAD~n --exec 'git commit --amend --no-edit -S'

小结

配置 Git 签名是迈向专业开发者的重要一步,它不仅保护了你的身份,也是对项目安全负责的体现。建议所有开发者都开启全局 SSH 签名配置。

相关推荐
Xu_youyaxianshen4 分钟前
Git 零基础常用指令手册(Gitee / GitHub 通用 )
git·gitee·github
John_ToDebug1 小时前
Git Stash 完全指南:临时保存工作区的艺术
人工智能·git·agent
阿里嘎多学长1 小时前
2026-07-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管
小蠢驴打代码1 小时前
记忆库能通过测试,不等于回答值得信:Coding Agent Memory 的两层评估设计
github·ai编程
骆驼10242 小时前
基于 PVE 与 SELKS 搭建企业级开源 IDS 流量监控平台
开源·ids·selks
武子康2 小时前
Copilot Code Review 从固定 Reviewer 演进为可编程 Runtime,仓库控制面、Setup 供应链、Runner 资源和 MCP 工具同时被纳入审查决策
人工智能·github·aigc
正在走向自律3 小时前
用豆包Seed Evolving打造全功能【AI智能记账】小程序,开源可落地
人工智能·小程序·开源·智能记账
GuWenyue10 小时前
写Agent还要重复封装工具?一套MCP多服务方案,3个能力让AI自动查地图、读写文件、操控浏览器
人工智能·机器学习·开源
wangruofeng12 小时前
opencodex 解锁 Codex 任意模型,一个本地代理打通 Claude/Kimi/GLM/DeepSeek
llm·github·openai