GPG 是我们实际使用的软件。它的核心逻辑是:一把公钥(给人),一把私钥(自己留着)。
我们分 5 步走:安装 -> 生成 -> 备份 -> 配置 Git -> 上传 GitHub。
第一步:安装 GPG
根据你的操作系统,使用包管理器安装。
-
MacOS (推荐):
Bash
brew install gnupg pinentry-mac(注:这里多装了一个
pinentry-mac,它是用来弹窗输入密码的,能完美解决你之前那个 “No such file” 的报错) -
Linux (Ubuntu/Debian):
Bash
sudo apt install gnupg
第二步:生成全新的密钥对
不要用简单的 --gen-key,我们要用 --full-generate-key 来获得更多控制权(比如加密算法和有效期)。
在终端输入:
Bash
gpg --full-generate-key
接下来的交互式选择(按我的推荐选):
-
加密算法:
-
会问你选哪种。推荐选
(1) RSA and RSA或者(9) ECC and ECC(Ed25519)。 -
建议: 选 ECC (Ed25519) (通常是选项 9)。它比 RSA 更短、更快、更安全。GitHub 完全支持。
-
-
椭圆曲线:
- 如果选了 ECC,默认选
Curve 25519即可。
- 如果选了 ECC,默认选
-
有效期:
-
问你密钥多久过期。千万不要选 0 (永不过期),这不安全。
-
输入
2y(2年后过期),到时候可以续期。
-
-
个人信息 (非常重要):
-
Real name: 输入你的名字(如
Weijun Li)。 -
Email address: 必须和你 Git 配置 (
git config user.email) 以及 GitHub 账号里的邮箱完全一致。 -
Comment: 可以留空,或者写备注(如
Work Laptop)。
-
-
Passphrase (密码):
- 它会弹窗让你设一个密码。这个密码保护你的私钥,以后每次提交代码都要输,请务必记住。
第三步:配置 GPG 代理 (解决之前的报错)
这是最关键的一步,为了防止出现 signing failed: No such file or directory。
我们需要告诉 GPG 用哪个程序来输入密码,并绑定终端。
1. 配置 gpg-agent.conf
在终端运行以下命令,自动写入配置:
Bash
# 创建目录(如果不存在)
mkdir -p ~/.gnupg
# 告诉 GPG 使用 pinentry-mac (MacOS用户)
# 如果你是 Linux,通常不需要这行,或者路径不同
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
# 强制杀死后台进程以应用配置
gpgconf --kill gpg-agent
2. 配置环境变量 (Zsh)
把你之前可能漏掉的环境变量加到 Zsh 配置文件中。执行:
Bash
echo 'export GPG_TTY=$(tty)' >> ~/.zshrc
source ~/.zshrc
第四步:将公钥告诉 Git 和 GitHub
1. 找到你的 Key ID
Bash
gpg --list-secret-keys --keyid-format=long
输出里 sec 这一行,ed25519/ 后面的那串字符就是 ID。例如:
sec ed25519/473722E5E60EB8A8 ...
你的 ID 就是 473722E5E60EB8A8。
2. 告诉 Git 使用这个 Key
Bash
# 设置你的 Key ID
git config --global user.signingkey 473722E5E60EB8A8
# 告诉 Git 所有的 commit 都要签名 (可选,但推荐)
git config --global commit.gpgsign true
# 告诉 Git GPG 程序在哪里
git config --global gpg.program $(which gpg)
3. 导出公钥给 GitHub
Bash
gpg --armor --export 473722E5E60EB8A8
复制输出的所有内容(包括 -----BEGIN PGP PUBLIC KEY BLOCK----- 开头和结尾)。
-
去 GitHub -> Settings -> SSH and GPG keys -> New GPG Key。
-
粘贴进去,保存。
第五步:验证与备份 (最后一步)
1. 测试提交
找个仓库试一下:
Bash
git commit --allow-empty -m "test signed commit"
如果弹出一个漂亮的 macOS 原生密码框,或者在终端里让你输入密码,并且成功提交,那就大功告成了!
2. 备份私钥 (救命用的)
电脑可能会丢,系统可能会重装。如果没有备份私钥,你的身份就丢失了。
Bash
# 导出私钥到文件 (妥善保管这个文件,别传网盘!)
gpg --export-secret-keys --armor 473722E5E60EB8A8 > my-private-key.asc
将 my-private-key.asc 存到加密的 USB 或 1Password/Bitwarden 的安全笔记里。
总结
现在你已经拥有了一个标准的 GPG 环境:
-
GPG Key:那是你的数字身份证。
-
Git Config:Git 知道用这张身份证盖章。
-
GPG Agent:负责在盖章时安全地问你要密码。
-
GitHub:存了你的公钥,用来验证那是你本人提交的代码(会显示绿色的
Verified标)。
下一步:
现在你可以去你的仓库执行 git commit 试试看了。如果还报错,把报错信息发给我,通常只剩下密码输入框弹出失败这一个坑了。