<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Commit Signing on 记录点滴 - 分享</title><link>https://www.iminling.com/tags/commit-signing/</link><description>Recent content in Commit Signing on 记录点滴 - 分享</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>iminling.com</copyright><lastBuildDate>Sun, 10 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.iminling.com/tags/commit-signing/index.xml" rel="self" type="application/rss+xml"/><item><title>GitHub 的 Verified 提交、SSH Key 与 noreply 隐私邮箱，一次讲清楚</title><link>https://www.iminling.com/p/github-verified-commit-and-noreply-guide/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://www.iminling.com/p/github-verified-commit-and-noreply-guide/</guid><description>&lt;img src="https://images.iminling.com/app/hide.php?key=QjdUU05JRzNQNi9udjlWVURKbW8rYnUyOURQWlpiQ3cydjlYb0h0dkREeEZRZnNnSG01VDczVUU3QXUwbGcxcnZqbzk=" alt="Featured image of post GitHub 的 Verified 提交、SSH Key 与 noreply 隐私邮箱，一次讲清楚" /&gt;&lt;p&gt;很多人第一次配 GitHub 提交签名时，都会被几个词绕晕：&lt;code&gt;邮箱验证&lt;/code&gt;、&lt;code&gt;noreply 匿名邮箱&lt;/code&gt;、&lt;code&gt;SSH key&lt;/code&gt;、&lt;code&gt;Verified&lt;/code&gt;，再加上一个经典问题：&lt;code&gt;GitHub 和 GitLab 会不会互相影响&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它们看起来都和“提交身份”有关，但其实管的是不同的事。&lt;/p&gt;
&lt;p&gt;这篇文章不聊花哨配置，只想把 4 个最常见的问题说清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Verified&lt;/code&gt; 到底是靠什么出现的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth key&lt;/code&gt; 和 &lt;code&gt;sign key&lt;/code&gt; 分别管什么&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noreply&lt;/code&gt; 到底能不能直接让提交变成 &lt;code&gt;Verified&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;本地同时操作 GitHub 和 GitLab 时应该怎么配&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="写在前面"&gt;写在前面
&lt;/h2&gt;&lt;p&gt;如果你只想先记住一句话，可以先看这 4 句：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;noreply&lt;/code&gt; 解决的是“提交里显示哪个邮箱”。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Verified&lt;/code&gt; 解决的是“这个提交有没有被数字签名验证通过”。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth key&lt;/code&gt; 解决的是“你能不能通过 SSH 连上 GitHub 并 push 代码”。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sign key&lt;/code&gt; 解决的是“GitHub 会不会把这次 commit 标记成 Verified”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这几件事彼此有关，但不是一回事。大多数人踩坑，不是因为命令不会敲，而是一开始就把目标搞混了。&lt;/p&gt;
&lt;p&gt;如果想更快建立整体判断，可以先看这张对照表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你想解决的问题&lt;/th&gt;
&lt;th&gt;主要看什么&lt;/th&gt;
&lt;th&gt;会不会直接影响 &lt;code&gt;Verified&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;会不会影响邮箱是否暴露&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;让提交显示 &lt;code&gt;Verified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否开启提交签名，公钥是否作为 &lt;code&gt;Signing Key&lt;/code&gt; 添加到账户&lt;/td&gt;
&lt;td&gt;会&lt;/td&gt;
&lt;td&gt;不直接决定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;让 &lt;code&gt;git push&lt;/code&gt; / &lt;code&gt;git pull&lt;/code&gt; 走 SSH&lt;/td&gt;
&lt;td&gt;SSH 认证 key 是否可用&lt;/td&gt;
&lt;td&gt;不会&lt;/td&gt;
&lt;td&gt;不会&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不暴露真实邮箱&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user.email&lt;/code&gt; 是否改成 &lt;code&gt;noreply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不会直接决定&lt;/td&gt;
&lt;td&gt;会&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;避免 GitHub 和 GitLab 配置互相污染&lt;/td&gt;
&lt;td&gt;全局配置和仓库本地配置怎么划分&lt;/td&gt;
&lt;td&gt;间接影响排查效率&lt;/td&gt;
&lt;td&gt;会&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="先分清三个最容易混淆的概念"&gt;先分清三个最容易混淆的概念
&lt;/h2&gt;&lt;h3 id="1-账号邮箱验证"&gt;1. 账号邮箱验证
&lt;/h3&gt;&lt;p&gt;这是 GitHub 账号层面的基础设置，说白了就是让 GitHub 确认“这个邮箱确实是你的”。&lt;/p&gt;
&lt;p&gt;它主要解决的是账号通知、找回、身份归属这些问题。&lt;/p&gt;
&lt;p&gt;但是它不会让你的提交自动显示 &lt;code&gt;Verified&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="2-提交显示-verified"&gt;2. 提交显示 &lt;code&gt;Verified&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;这指的是“这次提交有没有经过数字签名验证”。&lt;/p&gt;
&lt;p&gt;GitHub 会检查这次 commit 是否带有有效签名。当前支持 &lt;code&gt;GPG&lt;/code&gt;、&lt;code&gt;SSH&lt;/code&gt; 和 &lt;code&gt;S/MIME&lt;/code&gt; 三种方式。对大多数个人用户来说，&lt;code&gt;SSH&lt;/code&gt; 往往是最省事的一种。&lt;/p&gt;
&lt;p&gt;也就是说，&lt;code&gt;Verified&lt;/code&gt; 不是看你用了什么邮箱，而是看你有没有对提交做签名，以及 GitHub 能不能验证这个签名。&lt;/p&gt;
&lt;h3 id="3-noreply-隐私邮箱"&gt;3. &lt;code&gt;noreply&lt;/code&gt; 隐私邮箱
&lt;/h3&gt;&lt;p&gt;这是 GitHub 提供的一种匿名邮箱，用来避免你在 commit 里直接暴露真实邮箱。它常见的格式如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID+USERNAME@users.noreply.github.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它的作用是隐藏真实邮箱，同时让 GitHub 仍然可以把提交归属到你的账号和贡献图。&lt;/p&gt;
&lt;p&gt;但它本身不会让 commit 变成 &lt;code&gt;Verified&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="auth-key-和-sign-key-到底分别做什么"&gt;&lt;code&gt;auth key&lt;/code&gt; 和 &lt;code&gt;sign key&lt;/code&gt; 到底分别做什么
&lt;/h2&gt;&lt;p&gt;把这两个概念分清楚，后面的设置页面就不会那么绕。&lt;/p&gt;
&lt;h3 id="auth-key证明你能操作仓库"&gt;&lt;code&gt;auth key&lt;/code&gt;：证明“你能操作仓库”
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;auth key&lt;/code&gt; 用在 SSH 连接阶段，也就是你和 GitHub “建立连接”的时候，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone git@github.com:owner/repo.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当你执行这些命令时，GitHub 需要确认两件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你是不是这个账号的人&lt;/li&gt;
&lt;li&gt;你有没有权限访问这个仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 &lt;code&gt;auth key&lt;/code&gt; 的作用很直接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让你能通过 SSH 连接 GitHub&lt;/li&gt;
&lt;li&gt;让你能 clone、fetch、pull、push&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果没有它，SSH 方式下通常连 push 都过不去。&lt;/p&gt;
&lt;h3 id="sign-key证明这次提交确实是你签的"&gt;&lt;code&gt;sign key&lt;/code&gt;：证明“这次提交确实是你签的”
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;sign key&lt;/code&gt; 用在 &lt;code&gt;git commit&lt;/code&gt; 阶段。它不是拿来“登录 GitHub”的，而是给 commit 内容附带一个数字签名。&lt;/p&gt;
&lt;p&gt;当你执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -S -m &lt;span class="s2"&gt;&amp;#34;feat: add signed commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或者开启自动签名：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Git 会在 commit 里写入一段签名信息。GitHub 收到这个 commit 后，会检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;签名是否有效&lt;/li&gt;
&lt;li&gt;对应公钥是否已添加到你的 GitHub 账号&lt;/li&gt;
&lt;li&gt;这把公钥是否被登记为 &lt;code&gt;Signing Key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;都通过了，GitHub 才会显示 &lt;code&gt;Verified&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里有个很容易误会的点。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;user.email&lt;/code&gt; 会影响提交归属、贡献图统计，以及你有没有暴露真实邮箱；但不要把它直接理解成“SSH 签名能不能显示 Verified 的唯一前提”。对 SSH signing 来说，核心仍然是签名本身能否被你账号里的 &lt;code&gt;Signing Key&lt;/code&gt; 验证通过。&lt;/p&gt;
&lt;h3 id="一个比喻就够了"&gt;一个比喻就够了
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auth key&lt;/code&gt; 像门禁卡，决定你能不能进大楼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sign key&lt;/code&gt; 像签字章，决定这份文件能不能证明是你签的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两者可以是同一把钥匙材料，但职责不同。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么同一把-ssh-key-可以同时用于-auth-和-sign"&gt;为什么同一把 SSH key 可以同时用于 &lt;code&gt;auth&lt;/code&gt; 和 &lt;code&gt;sign&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;这也是很多人第一次配置时最容易卡住的地方。&lt;/p&gt;
&lt;p&gt;答案其实不复杂：&lt;code&gt;同一把 key 可以同时承担认证和签名两种用途，但 GitHub 会把这两种用途分开记录。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;比如你本地有这一对 key：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;私钥：&lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;公钥：&lt;code&gt;~/.ssh/id_ed25519.pub&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你完全可以只维护这一对密钥，然后在 GitHub 的 &lt;code&gt;Settings -&amp;gt; SSH and GPG keys&lt;/code&gt; 页面里按用途决定怎么登记：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果要让提交显示 &lt;code&gt;Verified&lt;/code&gt;，把公钥添加为 &lt;code&gt;Signing Key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果还要用同一把 key 走 SSH clone、pull、push，再额外把它添加为 &lt;code&gt;Authentication Key&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意，这不是要求你生成两把不同的 key。重点只是 GitHub 会把“认证用途”和“签名用途”分开记录。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同一把 key 可以同时给 &lt;code&gt;git push&lt;/code&gt; 做 SSH 认证&lt;/li&gt;
&lt;li&gt;同一把 key 也可以给 &lt;code&gt;git commit&lt;/code&gt; 做 SSH 签名&lt;/li&gt;
&lt;li&gt;但如果你只关心 &lt;code&gt;Verified&lt;/code&gt;，先配 &lt;code&gt;Signing Key&lt;/code&gt; 就够了&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="想让每次-github-新提交都显示-verified最推荐怎么配"&gt;想让每次 GitHub 新提交都显示 &lt;code&gt;Verified&lt;/code&gt;，最推荐怎么配
&lt;/h2&gt;&lt;p&gt;如果你主要是个人开发者，当前最省事的做法通常就是 &lt;code&gt;SSH commit signing&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="第一步确认-git-版本"&gt;第一步：确认 Git 版本
&lt;/h3&gt;&lt;p&gt;GitHub 官方说明，&lt;code&gt;SSH signature verification&lt;/code&gt; 需要 Git &lt;code&gt;2.34&lt;/code&gt; 或更高版本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第二步确认本机是否已有-ssh-key"&gt;第二步：确认本机是否已有 SSH key
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -al ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你已经有 &lt;code&gt;id_ed25519&lt;/code&gt; 和 &lt;code&gt;id_ed25519.pub&lt;/code&gt;，大多数情况下可以直接复用。&lt;/p&gt;
&lt;p&gt;如果没有，可以生成一把新的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -C &lt;span class="s2"&gt;&amp;#34;你的GitHub邮箱&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第三步先添加-signing-key需要-ssh-传输时再补-authentication-key"&gt;第三步：先添加 &lt;code&gt;Signing Key&lt;/code&gt;，需要 SSH 传输时再补 &lt;code&gt;Authentication Key&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;进入 GitHub：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Settings -&amp;gt; SSH and GPG keys&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果你的目标只是让提交显示 &lt;code&gt;Verified&lt;/code&gt;，关键动作是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一次作为 &lt;code&gt;Signing Key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你还想继续用这把 key 走 SSH 方式 clone、pull、push，再额外添加一次：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一次作为 &lt;code&gt;Authentication Key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Verified&lt;/code&gt; 主要取决于 &lt;code&gt;Signing Key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Authentication Key&lt;/code&gt; 只负责 SSH 传输认证&lt;/li&gt;
&lt;li&gt;两者可以是同一把 key，但不是必须为了 &lt;code&gt;Verified&lt;/code&gt; 同时都配上&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第四步告诉-git-以后用这把-key-给提交签名"&gt;第四步：告诉 Git 以后用这把 key 给提交签名
&lt;/h3&gt;&lt;p&gt;如果你想让当前仓库自动签名：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config gpg.format ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config user.signingkey ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你希望所有仓库都默认启用签名，可以把上面的命令都加上 &lt;code&gt;--global&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但如果你同时还在用 GitLab，而且不想让 GitLab 仓库默认签名，我更建议只在 GitHub 仓库里做本地配置，不要一开始就全局打开。&lt;/p&gt;
&lt;h3 id="第五步确认提交邮箱配置正确"&gt;第五步：确认提交邮箱配置正确
&lt;/h3&gt;&lt;p&gt;这一点很容易被忽略。即使签名没问题，如果 &lt;code&gt;user.email&lt;/code&gt; 配置得很混乱，后续在排查贡献归属、邮箱暴露和多平台配置时会非常烦。&lt;/p&gt;
&lt;p&gt;先看当前仓库实际使用的邮箱：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config user.email
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你希望隐藏真实邮箱，可以在 GitHub 仓库里设置成自己的 &lt;code&gt;noreply&lt;/code&gt; 地址：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config user.email &lt;span class="s2"&gt;&amp;#34;你的GitHub-noreply邮箱&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;更直白一点说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user.email&lt;/code&gt; 主要决定提交里写入哪个邮箱&lt;/li&gt;
&lt;li&gt;它影响隐私暴露和账号归属&lt;/li&gt;
&lt;li&gt;但不要把它直接等同于“SSH 签名能不能生效”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第六步做一次测试提交"&gt;第六步：做一次测试提交
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;test signed commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果前面的签名配置都已生效，这次新提交推到 GitHub 后，通常就会显示 &lt;code&gt;Verified&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="补充为什么网页上直接改文件也可能显示-verified"&gt;补充：为什么网页上直接改文件，也可能显示 &lt;code&gt;Verified&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;这个问题也很常见。&lt;/p&gt;
&lt;p&gt;如果你是在 GitHub 网页端直接编辑文件、合并某些 PR，或者通过 GitHub 提供的受支持界面生成提交，这类提交可能会由 GitHub 代表平台自动签名。
所以即使你本地没配 SSH signing，页面上仍然可能看到 &lt;code&gt;Verified&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这和“你在本地命令行里如何配置签名”不是一回事，别把两者混在一起。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="同时使用-github-和-gitlab应该怎么配才不互相干扰"&gt;同时使用 GitHub 和 GitLab，应该怎么配才不互相干扰
&lt;/h2&gt;&lt;p&gt;这是实际使用里比“按钮怎么点”更重要的问题。&lt;/p&gt;
&lt;p&gt;很多人的真实场景不是“我只用 GitHub”，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部分仓库推到 GitHub&lt;/li&gt;
&lt;li&gt;一部分仓库推到 GitLab&lt;/li&gt;
&lt;li&gt;GitHub 想要 &lt;code&gt;Verified&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitLab 不一定想开启签名验证&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种情况下，最稳妥的做法不是一上来就全局把所有东西都打开，而是把“你具备签名能力”和“哪些仓库默认启用签名”分开。&lt;/p&gt;
&lt;h3 id="推荐方案只在-github-仓库开启自动签名"&gt;推荐方案：只在 GitHub 仓库开启自动签名
&lt;/h3&gt;&lt;p&gt;全局只保留基础能力：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global gpg.format ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.signingkey ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;GitHub 仓库里单独开启：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config user.email &lt;span class="s2"&gt;&amp;#34;你的GitHub-noreply邮箱&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;GitLab 仓库里保持普通配置，或者显式关闭：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config commit.gpgsign &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config user.email &lt;span class="s2"&gt;&amp;#34;你的GitLab邮箱&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样配置的好处很直接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 仓库会自动签名，提交更容易显示 &lt;code&gt;Verified&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitLab 仓库不会被你无意中全局签名&lt;/li&gt;
&lt;li&gt;两个平台的邮箱也能分开管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如果你接受所有仓库都默认签名"&gt;如果你接受所有仓库都默认签名
&lt;/h3&gt;&lt;p&gt;那也可以直接全局开启：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global gpg.format ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.signingkey ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样通常不会影响 GitLab 的正常 push。只是 GitLab 那边如果没有配置对应的签名 key，页面未必会显示它自己的验证状态。&lt;/p&gt;
&lt;h3 id="最后一定要会看实际生效配置"&gt;最后一定要会看实际生效配置
&lt;/h3&gt;&lt;p&gt;这条命令非常实用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --list --show-origin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它能直接告诉你当前仓库到底是哪里把 &lt;code&gt;user.email&lt;/code&gt;、&lt;code&gt;commit.gpgsign&lt;/code&gt;、&lt;code&gt;user.signingkey&lt;/code&gt; 这些值设上的。很多“为什么和我想的不一样”的问题，都是靠这条命令排查出来的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="noreply-隐私邮箱到底解决什么问题"&gt;&lt;code&gt;noreply&lt;/code&gt; 隐私邮箱到底解决什么问题
&lt;/h2&gt;&lt;p&gt;它只解决一个问题：&lt;code&gt;避免在 commit 里公开暴露真实邮箱&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果你不想把真实邮箱直接写进 Git 历史里，就可以把 GitHub 仓库的提交邮箱改成 GitHub 提供的匿名地址。&lt;/p&gt;
&lt;h3 id="它不会替你完成签名"&gt;它不会替你完成签名
&lt;/h3&gt;&lt;p&gt;这一点最容易被误会。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用真实邮箱但不签名，不会有 &lt;code&gt;Verified&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;noreply&lt;/code&gt; 但不签名，也不会有 &lt;code&gt;Verified&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;只有签名通过了，才会显示 &lt;code&gt;Verified&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以最理想的组合通常是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提交邮箱用 &lt;code&gt;noreply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;提交本身用 &lt;code&gt;SSH&lt;/code&gt; 或 &lt;code&gt;GPG&lt;/code&gt; 签名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是同时兼顾“匿名”和“已验证”。&lt;/p&gt;
&lt;h3 id="它在网页端和命令行端的行为不一样"&gt;它在网页端和命令行端的行为不一样
&lt;/h3&gt;&lt;p&gt;如果你在 GitHub 账号设置里开启了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Keep my email addresses private&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么 GitHub 网页端产生的提交会优先使用 &lt;code&gt;noreply&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但如果你在本地命令行里提交，GitHub 不会自动改写你的 &lt;code&gt;user.email&lt;/code&gt;。真正生效的仍然是你本地 Git 配置。&lt;/p&gt;
&lt;p&gt;也就是说，如果你本地还是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config user.email &lt;span class="s2"&gt;&amp;#34;you@company.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;那你从命令行提交出去的 commit，依然会带着这个真实邮箱。&lt;/p&gt;
&lt;h3 id="这个设置建议一起打开"&gt;这个设置建议一起打开
&lt;/h3&gt;&lt;p&gt;如果你很在意邮箱泄露，建议在 GitHub 的 &lt;code&gt;Settings -&amp;gt; Emails&lt;/code&gt; 中一并开启：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Keep my email addresses private&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Block command line pushes that expose my email&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第二个选项的意义是：如果你从命令行 push 了会暴露私人邮箱的提交，GitHub 可以直接阻止这次 push，避免你事后才发现配置配错了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="开启-noreply-之后旧-commit-会不会自动变匿名"&gt;开启 &lt;code&gt;noreply&lt;/code&gt; 之后，旧 commit 会不会自动变匿名
&lt;/h2&gt;&lt;p&gt;不会。&lt;/p&gt;
&lt;p&gt;这件事没有灰度空间，结论就是：&lt;code&gt;历史提交不会因为你后来改了邮箱策略而自动重写&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;原因也不复杂。Git 的 commit 对象里本来就记录了当时的作者和提交者信息。只要那次提交已经生成，它的邮箱元数据也就固定了。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;旧 commit 当时如果用的是真实邮箱，历史里还是那个真实邮箱&lt;/li&gt;
&lt;li&gt;你后来开启 &lt;code&gt;Keep my email addresses private&lt;/code&gt;，只会影响之后的新提交&lt;/li&gt;
&lt;li&gt;GitHub 不会替你重写仓库历史&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果仓库已经公开，工程上就应该默认认为这些旧邮箱已经跟着 Git 历史一起公开过了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="如果想把旧-commit-也改成匿名邮箱要付出什么代价"&gt;如果想把旧 commit 也改成匿名邮箱，要付出什么代价
&lt;/h2&gt;&lt;p&gt;真正有效的方法只有一个：&lt;code&gt;重写 Git 历史&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;常见做法是用 &lt;code&gt;git-filter-repo&lt;/code&gt; 之类的工具，把旧提交里的 author 或 committer email 批量替换掉，然后再强制推送。&lt;/p&gt;
&lt;p&gt;但这件事的代价不小：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有受影响 commit 的 hash 都会变化&lt;/li&gt;
&lt;li&gt;依赖这些历史的分支、标签、PR 引用都会受到影响&lt;/li&gt;
&lt;li&gt;协作者本地仓库需要重新同步，严重时甚至要重新 clone&lt;/li&gt;
&lt;li&gt;如果仓库已经被 fork、镜像或拉取，旧历史也不一定能彻底消失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以大多数情况下，更现实的做法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保留旧历史&lt;/li&gt;
&lt;li&gt;从现在开始改用 &lt;code&gt;noreply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;开启命令行邮箱泄露拦截&lt;/li&gt;
&lt;li&gt;以后新提交全部走签名&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="什么情况下可以考虑重写历史"&gt;什么情况下可以考虑重写历史
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;私有仓库&lt;/li&gt;
&lt;li&gt;协作者很少，最好只有自己&lt;/li&gt;
&lt;li&gt;历史不复杂，强推成本可控&lt;/li&gt;
&lt;li&gt;你能接受所有 commit hash 变化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="什么情况下通常不建议动"&gt;什么情况下通常不建议动
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;公开仓库&lt;/li&gt;
&lt;li&gt;多人长期协作仓库&lt;/li&gt;
&lt;li&gt;已经有外部分支、fork、PR、issue 引用的仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多人真正需要的，其实不是“把过去全部抹干净”，而是“从今天开始不再继续泄露”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="最后给三个直接可用的结论"&gt;最后给三个直接可用的结论
&lt;/h2&gt;&lt;h3 id="场景一只想让-github-新提交显示-verified"&gt;场景一：只想让 GitHub 新提交显示 &lt;code&gt;Verified&lt;/code&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;直接配 &lt;code&gt;SSH signing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把公钥作为 &lt;code&gt;Signing Key&lt;/code&gt; 加到 GitHub&lt;/li&gt;
&lt;li&gt;在 GitHub 仓库里开启 &lt;code&gt;commit.gpgsign&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="场景二既想-verified又不想暴露真实邮箱"&gt;场景二：既想 &lt;code&gt;Verified&lt;/code&gt;，又不想暴露真实邮箱
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;提交邮箱用 GitHub 的 &lt;code&gt;noreply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;提交继续做 &lt;code&gt;SSH signing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;同时打开 &lt;code&gt;Keep my email addresses private&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="场景三本地同时操作-github-和-gitlab"&gt;场景三：本地同时操作 GitHub 和 GitLab
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;全局只配置签名能力，不默认全仓库自动签名&lt;/li&gt;
&lt;li&gt;GitHub 仓库本地开启 &lt;code&gt;commit.gpgsign true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitLab 仓库保持普通邮箱和普通提交&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套方式通常最不容易互相污染。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考文档"&gt;参考文档
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification" target="_blank" rel="noopener"
&gt;About commit signature verification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key" target="_blank" rel="noopener"
&gt;Telling Git about your signing key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account" target="_blank" rel="noopener"
&gt;Adding a new SSH key to your GitHub account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/account-and-profile/reference/email-addresses-reference" target="_blank" rel="noopener"
&gt;Email addresses reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/account-and-profile/how-tos/email-preferences/setting-your-commit-email-address?platform=mac" target="_blank" rel="noopener"
&gt;Setting your commit email address&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/blocking-command-line-pushes-that-expose-your-personal-email-address" target="_blank" rel="noopener"
&gt;Blocking command line pushes that expose your personal email address&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Docs: &lt;a class="link" href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository" target="_blank" rel="noopener"
&gt;Removing sensitive data from a repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只保留一句总结，那就是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;noreply&lt;/code&gt; 管的是“显示哪个邮箱”，&lt;code&gt;Verified&lt;/code&gt; 管的是“这个提交有没有被签名验证通过”，&lt;code&gt;auth key&lt;/code&gt; 管的是“你能不能连上仓库”。&lt;/p&gt;</description></item></channel></rss>