年初接手一台别人留下的开发机,配置 Git 环境时发现:GitHub 的个人仓库、公司 GitLab 的团队项目、还有几个客户放在 Gitee 上的私有库,居然共存了整整一年。按理说一个 git 用户凭据管理的事,不该折腾一上午,但实际情况是——每次 push 不是 403 就是让你重新输账号,提交记录里作者名字忽而英文忽而中文,某天同事问我"这个提交是谁的",场面一度非常尴尬。
这类问题的根源,几乎都出在 git凭据管理 没有处理好 多平台凭据共存 这件事上。很多人以为装完 Git 就能一劳永逸,其实 Git 的凭据体系远没有表面看起来那么简单:HTTPS 有 HTTPS 的存法,SSH 有 SSH 的玩法,平台之间的 token 机制还不一样,再加上每家公司自己搭的 GitLab 认证策略千奇百怪,指望"装完就忘"是不可能的。这篇博文我把踩过的坑、验证过的方案、以及最终的配置模板全部整理出来,覆盖从原理到实操再到排查的完整链路,适合正在被多个 Git 平台折磨、或者刚准备好好梳理一遍本地 Git 环境的开发者。
1. 一台电脑同时面对 GitHub、GitLab、Gitee 时的真实狼狈
先讲我自己的场景,方便你对照。
平时主要维护三个平台的仓库:GitHub 上放开源小工具和个人博客,公司 GitLab 放团队协作的商用项目,Gitee 上同步一些给客户交付的私有代码。再加上偶尔帮朋友提交几笔 GitHub 仓库,等于一台电脑最少要面对三套凭据、四个 Git 身份。
1.1 最典型的三个症状
第一,HTTPS 凭据互相覆盖。Git 默认的存储规则是以 protocol://host 为 key 的,GitHub 和 GitLab 主机名不一样,理论上各存各的。但实际用起来你会发现,Git Credential Manager 经常抽风,尤其是当你同时配置了多个 helper,或者在某个仓库里手动改了 credential.helper,新输入的 token 会覆盖掉旧平台的凭据。等你再 push 回原平台,直接 403。
第二,SSH key 混乱。有人图省事,把同一把公钥往 GitHub、GitLab、Gitee 全平台都黏了一遍。这个方法早期还行,但只要你某一天需要撤销某个平台的权限,或者一个平台挂两个账号,就彻底完蛋——git 会按顺序把 ~/.ssh 下的私钥挨个试一遍,经常把 A 平台的私钥发给 B 平台的服务器,然后收到一句冷冰冰的 Permission denied (publickey)。
第三,提交身份不统一。公司要求 GitLab 上的提交必须用企业邮箱,而 GitHub 上你不能暴露企业邮箱(垃圾邮件太多),两边 user.email 要求完全相反。如果只在全局配一份 user.name / user.email,那就只能二选一,换平台就得手动改,忘了改就提交一串错误身份的历史记录,后果很严重。
1.2 共存要解决的其实是两个层面
理顺之后你会发现,多平台凭据共存不是一个问题,而是两个:
| 层面 | 需要解决的核心 | 涉及的 Git 机制 |
|---|---|---|
| 认证层 | 各平台、各账号的登录凭据互不干扰、能正确命中 | credential helper、~/.ssh/config、useHttpPath |
| 身份层 | 不同仓库使用不同的提交作者信息 | includeIf 条件配置、仓库级 user.name/user.email |
认证层解决"能不能推上去",身份层解决"推上去之后显示的是谁"。很多教程只讲认证层,不讲身份层,结果代码推上去了,事后看提交记录又是乱成一锅粥。所以这篇把两层都安排,你在配置的时候最好一步到位。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 凭据的存取路径:HTTPS、SSH 与 credential helper 到底是怎么协作的
先别急着抄配置,花两分钟把 Git 的凭据体系搞清楚,后面遇到任何奇怪的报错都知道该往哪个方向查。
2.1 HTTPS 凭据的存取机制
当你用 https:// 开头的地址 clone 或 push 时,Git 需要一个用户名 + 密码(或者 token)来认证。Git 本身不负责保存这些信息,它只负责向"凭据助手"(credential helper)发起询问:
- 没配 helper:每次都要手动输入,Git 不会保存任何东西。
- 配了 cache:凭据只保存在内存里,几分钟后失效,下次重新输。
- 配了 store:凭据以明文写到
~/.git-credentials,不推荐,等于把密码裸奔在磁盘上。 - 配了 manager(Windows 的 Git Credential Manager,macOS 的 osxkeychain,Linux 的 libsecret):凭据存入系统级的安全存储,最推荐。
Git for Windows 官方安装包默认给你装好 Git Credential Manager(GCM),正常情况下你第一次输完密码后 Git 就会记住它。问题恰恰出在"记住"这个动作上——Git 默认以 protocol + host 作为凭据的 key,两个仓库如果都托管在 github.com 但你用了两个不同的账号,后输入的凭据会直接覆盖前者。
2.2 SSH 密钥的工作方式
SSH 方式不一样,它靠密钥对:私钥留在本地 ~/.ssh/,公钥贴
