在单台电脑上管理多个 Git 账户(如个人 GitHub 和公司 GitLab),最推荐通过修改本地 SSH 配置文件~/.ssh/config来区分不同仓库的密钥。适用场景为同一台设备需要切换不同身份提交代码,风险边界在于配置文件权限必须设置为 600 且远程仓库地址需对应修改为 SSH 协议。
先说结论:通过 SSH Config 别名映射不同 IdentityFile 是实现 Git 多账户隔离的标准方案,无需频繁切换全局配置。
- 适合:同一台开发机需要同时登录多个 GitHub 或 GitLab 账户的场景。
- 先准备:确保已生成多对 SSH 密钥公钥并分别添加到对应代码平台的账户设置中。
- 验收:使用
ssh -T命令测试不同 Host 别名能否成功握手并显示对应用户名。
命令速用版
直接在~/.ssh/config文件中添加如下配置片段,即可将不同域名或别名绑定到特定密钥文件。
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
为什么会这样
SSH 客户端默认只读取默认密钥文件(如id_rsa),无法自动识别不同仓库所需的特定身份。通过配置~/.ssh/config,可以告诉 SSH 客户端当连接特定 Host 别名时,强制使用指定的私钥文件进行认证,从而实现账户隔离。
分步处理
按照以下顺序完成密钥生成、配置映射和仓库地址更新,每一步完成后需确认无误再进行下一步。
- 生成新密钥:运行
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_rsa_work,注意-f参数指定文件名以避免覆盖默认密钥。 - 添加公钥到平台:将生成的
.pub公钥文件内容复制到对应 Git 平台的 SSH Keys 设置页面。 - 配置 SSH Config:编辑
~/.ssh/config文件,若不存在则新建,写入 Host 映射规则,确保IdentityFile路径绝对正确。 - 修改仓库远程地址:进入本地仓库目录,执行
git remote set-url origin git@github.com-work:username/repo.git,将默认域名替换为配置文件中定义的 Host 别名。
怎么验证是否生效
使用ssh -T命令连接配置的 Host 别名,观察返回信息中的用户名是否匹配预期账户。
ssh -T git@github.com-work
若配置正确,终端会显示Hi username! You've successfully authenticated...,其中username应为该密钥对应的账户名。
常见坑
- 配置文件权限错误:
~/.ssh/config文件权限必须设置为 600,否则 SSH 会忽略该配置,使用命令chmod 600 ~/.ssh/config修复。 - 远程地址未更新:仅配置 SSH 不够,必须将 git remote url 中的域名改为 Config 中定义的 Host 别名,否则仍会使用默认密钥。
- 密钥格式兼容性问题:部分老旧 Git 服务器可能不支持 ed25519 算法,如遇兼容问题可改用
-t rsa -b 4096生成密钥。
常见问题
Permission denied (publickey) 报错怎么解决
首先检查 SSH Config 中 IdentityFile 路径是否正确,其次确认公钥已添加到对应平台的账户设置中,最后验证配置文件权限是否为 600。
如何确认当前仓库使用的是哪个账户
执行ssh -T git@<Host 别名>命令,返回信息中的 Hi 后面跟随的用户名即为当前密钥对应的账户身份。
HTTPS 协议的仓库需要配置 SSH Key 吗
不需要,HTTPS 协议使用用户名密码或 Personal Access Token 认证,SSH Key 配置仅对 SSH 协议格式的仓库地址生效。
参考来源
- GitHub Docs, "Connecting to GitHub with SSH", https://docs.github.com/en/authentication/connecting-to-github-with-ssh
- OpenSSH Manual, "ssh_config", https://man.openbsd.org/ssh_config