十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Gitee开源项目邮箱防泄露:noreply配置与历史提交清洗

Gitee开源项目邮箱防泄露:noreply配置与历史提交清洗 前阵子有个朋友来找我说他在 Gitee 上开源了个小工具结果不到一个月注册用的那个邮箱开始疯狂收到各类推广邮件有几封甚至能准确叫出他的昵称和项目名。他一开始怀疑是某个第三方平台泄露了数据排查了一圈才发现问题出在他自己的 Git 提交里——每次 commitGit 都会把user.name和user.email原封不动写进提交对象只要仓库是公开的任何人 clone 下来执行一条git log就能把作者邮箱整整齐齐导出来。这件事其实特别常见尤其是刚开始用 Gitee 的朋友创建仓库、上传代码到 gitee、写 README、兴冲冲地把第一个开源项目推上去全程只关心代码能不能跑压根没想过邮箱这一栏也需要配置。等到垃圾邮件堆满收件箱或者被人拿邮箱去反查其他平台账号时才反应过来。Gitee 其实早就提供了不公开我的邮箱地址这个选项配合专属的 noreply 邮箱可以做到既正常提交代码、贡献统计照常显示又不把自己的真实邮箱写进公开的提交历史里。这篇内容就是围绕这个设置展开的。我会从邮箱到底从哪几个口子漏出去讲起把 Gitee 不公开邮箱的机制拆开说明白然后给出完整的配置步骤——包括新仓库怎么配、老仓库里已经推上去的历史提交怎么清洗、一台电脑同时管多个账号怎么处理。不管你是用命令行推送还是用 IDEA、PyCharm 自带的插件提交到 Gitee或者用 VS Code 的 Gitee 插件上传代码底下这一层 Git 配置的逻辑都是通用的配一次能管很久。1. Gitee 上邮箱到底会从哪几个口子漏出去1.1 提交对象里的 author 和 committer 才是最容易被忽略的源头很多人以为邮箱泄露是平台把用户信息卖了其实在 Git 这套体系里邮箱是你自己亲手写进每一个提交的。一个 commit 对象里存了这么几样东西指向文件快照的 tree 对象、指向上一个提交的 parent、一条提交说明 message以及两组身份信息——author谁写的这段代码和committer谁把它提交进来的。这两组信息都是名字 邮箱 时间戳 时区的格式明文存储没有任何加密。这意味着什么呢只要仓库是公开的任何一个人 clone 下来执行git log --format%an %ae就能把所有作者的邮箱列成一张表。就算他不 clone只在 Gitee 网页上翻提交历史鼠标悬停在作者头像上或者点进某次提交的详情页也能看到邮箱。更省事的办法是直接调 Gitee 的开放 API 拉取提交列表几百个仓库的邮箱几分钟就能扫完写个脚本就能批量收集。我自己早期就有过这个习惯——装完 Git 第一件事是git config --global user.name xxx和git config --global user.email 我的常用邮箱然后所有项目共用这一套配置。便利是真便利但代价就是所有公开仓库的作者邮箱都是同一个真实地址一旦某个仓库火了这个邮箱基本就废了。1.2 网页端的展示位比你想象的多除了提交详情页Gitee 还有几个位置会展示邮箱相关信息。仓库主页右侧的贡献者列表、项目统计里的提交者排行、个人主页的动态时间线这些地方虽然多数只显示昵称和头像但头像和昵称的关联是靠邮箱做的匹配。另外如果你在 Gitee 上开启了某些通知或者 Webhook通知邮件里也会带上提交者信息。还有一个容易被忽略的点fork 出来的仓库会完整继承原仓库的提交历史。也就是说你在自己仓库里做的邮箱清洗如果没有同步到别人 fork 的副本上那些副本里依然留着你原来的邮箱。这个属于不可控因素只能靠提前配置来规避事后补救很难做干净。1.3 爬虫聚合与跨平台反查才是真正的风险单看一个邮箱好像没什么但邮箱是互联网上最强的身份锚点之一。同一个邮箱注册了哪些平台、在哪些论坛发过帖、绑定了哪些社交账号通过搜索引擎和一些聚合服务是能串起来的。攻击者拿到你的邮箱之后常见的玩法是去各大平台试忘记密码流程看哪些平台会返回该邮箱未注册、哪些会返回验证码已发送从而判断你在哪些网站有账号。更直接的是撞库。很多人不同平台用同一个密码邮箱一旦暴露配合从别处泄露的密码库就能批量尝试登录。这也是为什么我一直建议开源项目用一个专门的身份标识别和你的私人邮箱、工作邮箱混在一起。Gitee 的 noreply 邮箱就是为这个场景设计的。2. Gitee 的不公开邮箱机制到底做了什么2.1 noreply 地址的本质是一个身份标识不是收件箱Gitee 在账户设置里提供了不公开我的邮箱地址这个开关。打开之后系统会给你生成一个专属的替代邮箱格式大致是你的用户名user.noreply.gitee.com这种样子。这个地址的关键在于它不是一个真实可收信的邮箱任何发往这个地址的邮件都不会转投到你的真实邮箱也没有人能从它反推出你的真实地址。它的作用更像是一个身份工牌。Gitee 知道这个工牌属于你所以你用这个地址提交代码时平台能把提交正确归属到你的账号上头像、贡献统计、提交记录一切照常。但对外部世界来说这个地址只是一串没有实际指向的标识符爬虫抓到了也没用。注意具体的 noreply 地址格式以你自己设置页面里显示的那一串为准不要凭记忆手打。不同时期注册的账号、或者平台做过调整的情况下格式可能存在差异直接从页面上复制粘贴是最稳的做法。2.2 为什么不能随便填个假邮箱或者乱写一个地址有人会想那我直接填abcabc.com不就行了反正也是假的。这个想法在技术上行不通原因在于Gitee 是靠邮箱来匹配提交归属的。你在本地 Git 里设置的user.email是平台判断这次提交属于哪个账号的唯一依据。如果填了一个平台不认识的地址会出现两个后果一是提交记录里的作者头像会变成默认的灰色占位图不能点进你的主页二是这个提交不会计入你的贡献统计个人主页上的贡献格子会是空白的。对于想通过开源项目积累个人技术履历的人来说这个损失其实挺大——别人点进你的主页看到的是一片空白的贡献图第一印象就打了折扣。所以正确的做法不是造假而是用平台发给你的替身。Gitee 给你 noreply 地址就是为了让你在保真的前提下完成隐私隔离。2.3 开关只管平台侧不改你本地的任何东西这是最容易踩的坑我见过不止一个人开了开关之后就以为万事大吉结果推上去的提交里还是原来的邮箱。原因是这个开关的作用范围只在 Gitee 平台这一侧——它决定了网页端怎么展示你的邮箱、以及给你生成哪个 noreply 地址。它不会去改你本地电脑上git config里的配置更不会自动改写你已经推上去的历史提交。这两件事必须分开做平台侧开开关解决展示问题本地侧改配置解决新提交问题历史清洗解决旧提交问题。三件事缺一件邮箱该漏还是漏。下面我就按这三块分别讲。3. 手把手从零把邮箱隐私配置到位3.1 第一步网页端开启邮箱隐私开关并拿到专属地址登录 Gitee 之后进入个人设置区域找到邮箱相关的管理页面。不同版本入口的文字可能略有差异一般在设置里的邮箱管理或者隐私设置下面找关键词不公开我的邮箱地址或者邮箱隐私。勾选之后页面上会显示一个属于你的 noreply 邮箱地址。把这个地址复制下来存好后面本地配置要用。这个地址是可以随时回来查的不用担心弄丢。提示如果你同时维护多个 Gitee 账号比如一个私人号、一个公司号建议给每个账号都单独开这个开关然后把两个 noreply 地址分别记在各自的备注里。混用会导致提交归属错乱后面对账会很痛苦。3.2 第二步配置本地 Git 的身份信息打开终端先看一下当前的配置是什么git config --global user.name git config --global user.email默认情况下user.email就是你当初装 Git 时填的那个真实邮箱要改成刚拿到的 noreply 地址。最省事的做法是全局改一次git config --global user.name 你的昵称 git config --global user.email 你的用户名user.noreply.gitee.com这样以后所有新克隆或者新建的仓库默认都用这套身份。因为不公开邮箱本来就是给公开项目用的而绝大多数人日常用 Git 也就是提交到 Gitee、GitHub 这类平台的公开仓库全局改掉对大部分人来说是最省心的方案。不过这里有个前提要提醒一下如果你同时还在用公司内部的 Git 服务全局改掉可能会导致公司那边的提交匹配不上内部账号。这种情况就别用全局改用下面说的仓库级配置。3.3 第三步区分全局配置和仓库级配置Git 的配置是分层的优先级从低到高大致是系统级/etc/gitconfig、全局级~/.gitconfig、仓库级仓库目录/.git/config。高优先级会覆盖低优先级。所以你可以用全局配置放一个默认身份再对特定仓库单独覆盖。仓库级配置的做法是进到仓库目录里执行不带--global的命令cd /path/to/your/repo git config user.name 你的昵称 git config user.email 你的用户名user.noreply.gitee.com这条命令只影响当前仓库写进.git/config文件里。你可以用git config --list --show-origin查看每个配置项到底来自哪个文件排查为什么改了没生效的时候特别有用。我自己的习惯是这样的全局配置里放一个中性的身份比如专门用于个人开源的 noreply 地址公司项目克隆下来第一件事就是执行一遍仓库级配置把身份切成公司的。虽然多一步但从来没出过归属错误。3.4 第四步确认提交里真的写进去了配置改完别急着推。先做一次测试提交或者查看已有的提交git log -1 --format作者: %an %ae%n提交者: %cn %ce如果显示的是你的 noreply 地址说明配置生效了。如果还是旧邮箱八九成是两个原因一是改错了配置文件比如改的是仓库级但你在另一个仓库里查二是你在某个工具里单独设置过身份覆盖了命令行配置。这里顺带说一个很多人不知道的点author 和 committer 是两个不同的字段。git commit时两者通常一样但如果你做过 rebase、cherry-pick、或者用网页端直接编辑文件提交committer 可能是平台或者别人。所以检查的时候最好两个都看一眼别只看 author 就觉得没问题。4. 已经推上去的历史提交怎么处理4.1 先判断要不要动手别上来就重写历史新提交配好了但老仓库里那些旧邮箱还在。要不要清洗我的建议是先评估情况建议做法私人仓库只有自己看可以不管等下次有空再处理公开仓库但仓库没什么人关注值得处理成本低公开仓库有别人 fork 过处理能清掉自己仓库但 fork 副本清不掉仓库有多个协作者已形成提交历史慎重重写会打乱所有人的本地分支邮箱已经和重要账号绑定且开始收到垃圾邮件优先处理同时考虑改邮箱核心判断依据是重写历史的代价。Git 的历史是一条链改掉中间某个提交的内容它后面所有提交的哈希值都会变。这意味着所有协作者的本地分支都会和远端对不上需要他们手动重置。如果仓库只有你一个人那这个代价约等于零随便改。4.2 只改几个提交用 rebase 最省事如果旧邮箱只出现在最近几次提交里用交互式 rebase 最快git rebase -i HEAD~5编辑器打开后把需要修改的那几个提交前面的pick改成edit保存退出。Git 会依次停在这些提交上每停一次就执行git commit --amend --author你的昵称 你的用户名user.noreply.gitee.com --no-edit git rebase --continue--no-edit表示保留原来的提交说明不改。全部走完之后用git log确认一下邮箱然后强制推送git push --force-with-lease origin main注意一定要用--force-with-lease而不是--force。前者会在推送前检查远端有没有你不知道的新提交如果有就会拒绝推送防止把别人的工作覆盖掉。这个习惯值得养成我见过太多因为图省事用--force把同事代码冲掉的惨案。4.3 大量提交批量重写用 filter-repo如果旧邮箱贯穿了整个仓库历史rebase 就不现实了得用批量重写工具。老牌的git filter-branch能用但速度慢而且官方已经标注不推荐。现在更推荐git-filter-repo速度快、用法清晰。先安装pip install git-filter-repo然后准备一个 mailmap 文件比如叫mailmap.txt内容格式是新身份 旧身份你的昵称 你的用户名user.noreply.gitee.com 旧昵称 旧邮箱example.com接着执行git filter-repo --mailmap mailmap.txt跑完之后 Git 会自动重写所有匹配的提交。需要提醒的是git filter-repo默认要求在一个干净的克隆上操作它会移除原有的 remote 配置处理完你需要重新加回来git remote add origin gitgitee.com:你的用户名/仓库名.git git push --force-with-lease origin --all git push --force-with-lease origin --tags动手之前务必备份仓库最简单的办法就是把整个目录复制一份或者先git clone --mirror一份到别处。重写历史是不可逆操作出错了没有后悔药。4.4 重写之后必须通知协作者历史重写完所有提交哈希都变了。协作者如果直接git pull会拉下来一堆冲突因为他们本地的历史和远端已经完全对不上。正确的做法是让每个人执行git fetch origin git reset --hard origin/main但这一步会丢掉他们本地未推送的提交所以一定要提前通知让大家先把本地工作提交或者暂存好。如果团队里有人不熟悉 Git这个过程最好由你带着走一遍别发个命令就完事。另外还有个现实问题如果这个仓库已经被别人 fork 或者克隆到本地长期使用你改了自己这边别人那边的副本还是旧邮箱。这是没法彻底解决的只能接受。所以提前配置永远比事后清洗划算。5. 一台电脑管多个账号怎么不配错5.1 用 includeIf 做目录级自动切换如果你同时有个人 Gitee 账号和公司内部 Git 账号手动切换身份很容易忘。Git 提供了一个includeIf机制可以按目录自动加载不同的配置。先在~/.gitconfig里写好条件[user] name 个人昵称 email 个人用户名user.noreply.gitee.com [includeIf gitdir:~/work/] path ~/.gitconfig-work然后新建~/.gitconfig-work[user] name 公司账号名 email 公司邮箱company.com这样只要仓库路径在~/work/下面Git 就会自动用公司身份其他位置一律用个人 noreply 身份。配一次一劳永逸比记着手动切来切去靠谱得多。5.2 澄清一个高频误解SSH 密钥和邮箱没关系经常有人问我配置 gitee 密钥的时候用的是旧邮箱是不是也要改答案是不用。SSH 密钥是用来做身份认证的它证明你有权往这个仓库推代码跟提交里写的作者是谁完全是两回事。密钥本身可以是邮箱形式的注释比如ssh-keygen -t ed25519 -C youremail.com但这个-C后面的内容只是密钥的一个标签方便你在密钥列表里辨认是哪一把它不会出现在任何提交记录里也影响不到提交归属。你完全可以把注释写成别的比如ssh-keygen -t ed25519 -C gitee-personal一样能用。真正决定提交里写什么邮箱的只有user.email这一项配置。把这两件事分开理解很多困惑就没了。6. 常见问题与排查速查表6.1 改完配置提交邮箱怎么还是旧的这是反馈最多的问题。按下面顺序排查基本能定位现象可能原因排查方法新提交邮箱没变改的是全局但仓库级有覆盖git config --list --show-origin看生效项来源新提交邮箱没变IDE 内置了独立的 Git 身份设置在 IDE 的版本控制设置里单独检查改了但还是旧邮箱改完没做新的提交看的是旧记录用git log -1只看最新一条提交归属不到账号noreply 地址抄错了回设置页复制别手打头像不显示提交时间较早平台未刷新等一段时间或重新推送触发刷新6.2 贡献统计不亮、头像变灰如果你的 noreply 地址没问题但个人主页的贡献格子还是不亮通常有几个原因。一是提交的邮箱和账号绑定的 noreply 地址不完全一致哪怕差一个字符也不行最简单的方法是从设置页复制。二是这个提交的 committer 不是你比如通过网页端合并 PR 产生的提交作者是你但提交者是平台。三是仓库本身是私有的私有仓库的贡献默认不计入公开贡献图。还有一种情况是延迟。Gitee 的贡献统计不是实时的有时候要等上几十分钟甚至更久才更新。遇到这种情况别急着反复改配置先等等看。6.3 几个容易踩的坑第一个坑是在网页端直接编辑文件提交。这种操作的 author 通常是你如果账号信息完整但 committer 会变成平台而且用的邮箱是账号绑定邮箱而不是你本地配置的 noreply 地址。如果你特别在意提交身份的纯净度尽量避免用网页端改代码统一在本地提交。第二个坑是用了带邮箱信息的提交模板或者钩子。有些团队会配置 commit-msg 钩子把提交者信息拼进提交说明里。这种情况光改user.email不够还得去改钩子脚本。第三个坑是清理历史之后忘了处理标签。git filter-repo默认会重写标签但如果用git filter-branch需要显式加--tag-name-filter cat参数否则标签还指向旧提交等于留了个后门。最后一个坑是以为删除重推就行了。有人想着那我干脆把仓库删了重新传一次不就行了理论上可以但 Gitee 的提交对象可能还有缓存而且别人 fork 的副本依然存在。与其折腾删库重建不如老老实实做历史清洗效果更干净。真要走删库重传这条路记得先把本地仓库的.git目录也一并清理掉不然新推上去的提交里带的还是旧邮箱。7. 我自己的配置习惯和一些补充建议前面把该讲的都讲完了最后分享几个我自己长期用下来觉得比较顺手的做法。第一个是分邮箱注册。我会专门用一个邮箱注册所有开源平台这个邮箱不用于任何私人通讯、不绑定支付、不接收重要通知。这样一来即使它因为某些原因暴露了损失也是可控的。配合 noreply 邮箱使用等于给开源身份上了双层隔离——提交里写的是 noreply账号绑定的是专用邮箱两者都不是我日常在用的地址。第二个是新仓库先配身份再写代码。我现在的固定动作是Gitee 上创建仓库本地 clone 下来第一件事就是检查git config user.email确认无误再开始写。因为一旦有了第一个提交后面再想改就得走历史重写麻烦程度完全是两个量级。第三个是定期审计。我会隔一段时间跑一次git log --format%ae | sort -u看看这个仓库里到底出现过哪些作者邮箱。如果发现了不该出现的地址说明某次配置串了可以及时处理。这个命令在多账号环境下特别有用能帮你在问题扩散前发现它。最后一个建议是关于心态的。邮箱隐私这事配一次花不了五分钟但事后补救可能要花几个小时还得协调所有协作者。如果你手里有公开仓库现在就打开配置看一眼比看完这篇就关掉页面有用得多。
返回列表