一、为什么需要多 Git 账号
在实际开发中,很多人会同时拥有多个 Git 账号:公司账号用于提交内部代码,个人账号用于开源项目或自己的仓库,有时还会有一个专门用于外包或客户项目的账号。如果所有仓库都使用同一个全局用户名和邮箱,就会出现提交记录归属错误、推送权限被拒绝,甚至把公司代码推到个人仓库的风险。
Git 本身并不限制一台电脑配置多少个账号,关键在于让不同的仓库自动使用不同的身份和密钥。本文从原理出发,给出可直接落地的配置方案。
二、核心原理:三层配置与 SSH 多密钥
要理解多账号配置,先要弄清 Git 的配置层级和 SSH 的认证流程。
2.1 Git 的三层配置
- 系统级 :
/etc/gitconfig,对本机所有用户生效,一般不需要改动。 - 全局级 :
~/.gitconfig,对当前用户所有仓库生效,通常存放默认的user.name和user.email。 - 仓库级 :
.git/config,只对当前仓库生效,优先级最高。
多账号的本质就是:全局配置放一个默认身份,仓库级配置按需覆盖。
2.2 SSH 多密钥的工作方式
使用 SSH 协议时,Git 通过 SSH 客户端连接远程仓库。默认情况下,SSH 会使用 ~/.ssh/id_rsa 或 ~/.ssh/id_ed25519 这一把默认密钥。要让不同账号使用不同密钥,需要做到两点:
- 为每个账号生成独立的密钥对,并分别添加到对应平台的 SSH Keys 设置中。
- 通过
~/.ssh/config为不同 Host 别名指定不同的密钥文件。
这样,同一个远程服务器(例如 github.com)就可以通过不同的 Host 别名,使用不同的密钥完成认证。
三、准备工作:生成多组 SSH 密钥
假设我们有两个账号:公司账号 work@example.com 和个人账号 me@example.com。分别生成密钥:
bash
# 公司账号
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/id_ed25519_work
个人账号
ssh-keygen -t ed25519 -C "me@example.com" -f ~/.ssh/id_ed25519_personal
执行过程中会提示输入 passphrase,可以直接回车留空,也可以设置密码提高安全性。生成完成后,~/.ssh 目录下会多出四个文件:
id_ed25519_work和id_ed25519_work.pubid_ed25519_personal和id_ed25519_personal.pub
其中 .pub 结尾的是公钥,需要分别复制到对应平台的 SSH Keys 页面;不带后缀的是私钥,绝对不能泄露。
提示:如果平台仍只支持 RSA,可以把
-t ed25519换成-t rsa -b 4096,其余步骤一致。
四、配置 ~/.ssh/config 实现密钥分流
编辑 ~/.ssh/config(不存在则新建),为每个账号配置一个 Host 别名:
bash
# 公司账号
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
个人账号
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
几个关键点:
Host是自定义别名,后续克隆仓库时用它替代github.com。HostName才是真实的服务器地址。IdentitiesOnly yes表示只使用指定的密钥,避免 SSH 依次尝试其他密钥导致认证失败。
配置完成后,建议收紧文件权限,否则 SSH 会拒绝使用:
bash
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/id_ed25519_work
chmod 600 ~/.ssh/id_ed25519_personal
五、验证 SSH 连接
分别测试两个别名是否认证成功:
bash
ssh -T git@github-work
ssh -T git@github-personal
如果看到类似 Hi xxx! You've successfully authenticated... 的输出,说明密钥配置正确。注意 GitHub 对 ssh -T 返回的是欢迎信息而不是 shell,这是正常现象。
如果提示 Permission denied (publickey),可以加上 -v 参数查看详细日志,重点检查 IdentityFile 路径和公钥是否已添加到对应账号。
六、为不同仓库设置独立身份
SSH 密钥解决的是"能不能推"的问题,user.name 和 user.email 解决的是"提交记录算谁的"的问题。两者需要分别配置。
6.1 全局默认身份
bash
git config --global user.name "Your Name"
git config --global user.email "me@example.com"
6.2 仓库级覆盖
进入公司项目目录,单独设置该仓库的身份:
bash
cd ~/projects/company-repo
git config user.name "Work Name"
git config user.email "work@example.com"
注意这里不要加 --global ,配置会写入当前仓库的 .git/config,只对本仓库生效。可以用下面的命令确认:
bash
git config --show-origin user.email
输出会显示该配置来自哪个文件,便于排查是否被全局配置覆盖。
七、克隆与远程地址的正确写法
配置好 Host 别名后,克隆仓库时要把地址中的 github.com 替换成别名:
bash
# 公司仓库
git clone git@github-work:company/backend.git
个人仓库
git clone git@github-personal:me/blog.git
如果仓库已经克隆过,可以修改远程地址:
bash
git remote set-url origin git@github-work:company/backend.git
git remote -v
这一步是最容易出错的地方:地址里如果仍然写 git@github.com,SSH 就会走默认密钥,多账号配置等于没生效。
八、进阶:用 includeIf 自动切换身份
手动为每个仓库执行 git config 比较繁琐。Git 提供了 includeIf 指令,可以按目录自动加载不同的配置文件。
先准备两个身份文件:
bash
# ~/.gitconfig-work
[user]
name = Work Name
email = work@example.com
~/.gitconfig-personal
[user]
name = Personal Name
email = me@example.com
然后在 ~/.gitconfig 中按目录匹配:
bash
[includeIf "gitdir:~/projects/company/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/projects/personal/"]
path = ~/.gitconfig-personal
这样,只要仓库位于 ~/projects/company/ 下,就会自动使用公司身份;位于 ~/projects/personal/ 下则使用个人身份,无需逐个仓库设置。
注意:
gitdir路径末尾的斜杠表示匹配该目录及其子目录,建议保留。
九、常见问题排查
| 现象 | 可能原因 | 解决方式 |
|---|---|---|
| Permission denied (publickey) | 密钥未加载或公钥未添加 | 检查 IdentityFile 路径,确认公钥已上传 |
| 推送到了错误的账号 | 远程地址仍使用默认 Host | 用 git remote -v 检查并改为别名地址 |
| 提交记录显示错误作者 | 仓库级 user.email 未设置 |
在仓库内执行 git config user.email |
| SSH 提示权限过宽 | 私钥文件权限过大 | 执行 chmod 600 收紧权限 |
| 配置不生效 | 多层配置优先级冲突 | 用 git config --show-origin 定位来源 |
十、总结
一台电脑配置多个 Git 账号,核心可以归纳为三件事:
- 密钥分离 :每个账号一对独立密钥,通过
~/.ssh/config的 Host 别名分流。 - 身份分离 :用仓库级
user.name和user.email覆盖全局配置,或用includeIf按目录自动切换。 - 地址正确 :克隆和远程地址必须使用 Host 别名,而不是原始的
github.com。
把这三点落实到位,多账号协作就能做到互不干扰,提交记录清晰可追溯。