不同本地GitHub项目如何配置不同用户名密码 解决推送403问题
问题根因
git config 中配置的 user.name、user.email 仅用于标记提交记录的署名信息,完全不参与HTTPS/SSH协议下的仓库权限认证。你遇到的403报错,本质是系统/ Git客户端缓存了userA账号的GitHub认证凭据,推送时Git优先读取了已缓存的凭据,和你配置的全局/本地级别署名没有关系,哪怕你本地的user.name改成任意字符串,只要缓存的凭据是userA的,推送时还是会以userA身份请求权限。
可落地解决方案
根据你当前用HTTPS协议推送的场景,优先选第一种方案,长期多账号使用推荐第二种SSH方案。
方案1:HTTPS协议下配置项目独立凭据
- 第一步:清空已缓存的错误凭据
- Windows:打开系统「凭据管理器」-「Windows凭据」,删除所有前缀为
git:https://github.com的凭据条目 - Mac:打开「钥匙串访问」,搜索
github.com,删除所有关联Git的凭据条目 - Linux:执行
git credential-cache exit清空内存缓存,再删除~/.git-credentials文件中所有GitHub相关的条目
- Windows:打开系统「凭据管理器」-「Windows凭据」,删除所有前缀为
- 第二步:进入需要用userB身份操作的项目目录,执行命令给当前项目单独配置认证用户名,配置仅对当前项目生效,不影响全局:
git config --local credential.https://github.com.username userB
- 第三步:执行
git push触发认证,按照提示输入userB账号对应的GitHub个人访问令牌(GitHub已废弃账号密码推送,令牌需勾选repo权限),认证通过后凭据会单独关联当前项目,后续推送不会再读取全局的userA凭据。 - 校验:在项目目录执行
git config --list --local,能看到credential.https://github.com.username=userB即为配置生效。
方案2:SSH协议多账号配置(长期使用更稳定,无凭据过期问题)
- 第一步:为userB账号单独生成SSH密钥对,执行命令时注意不要覆盖原有userA的密钥文件,密钥文件名单独命名为
id_ed25519_userB:
ssh-keygen -t ed25519 -C "userB@email.co.za" -f ~/.ssh/id_ed25519_userB
- 第二步:复制生成的
id_ed25519_userB.pub公钥内容,添加到userB对应GitHub账号的SSH密钥设置页。 - 第三步:编辑SSH配置文件(路径为
~/.ssh/config,不存在则新建空白文件),添加以下配置,为两个账号配置独立的主机别名:
# 全局默认userA账号配置 Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 # userB账号专属配置 Host github-userB HostName github.com User git IdentityFile ~/.ssh/id_ed25519_userB
- 第四步:进入需要用userB操作的项目目录,修改远程仓库地址为别名形式:
git remote set-url origin git@github-userB:userB/some-project.git
- 校验:执行
git push无需输入密码即可完成认证,全程不会调用userA的任何配置。
避坑提示
- 如果你使用第三方Git GUI客户端(SourceTree、GitHub Desktop等),需要额外检查客户端内置的凭据存储,多数客户端会独立缓存一套账号凭据,优先级高于系统凭据管理器。
- 不要试图仅通过修改
user.name/user.email切换账号身份,这两个配置只影响提交日志里的显示名,和仓库访问权限没有任何关联。
内容的提问来源于stack exchange,提问作者Wylie
相关产品推荐
相关产品推荐

