Git 配置多账户 SSH key 区分不同仓库怎么设置

文章导读
在单台电脑上管理多个 Git 账户(如个人 GitHub 和公司 GitLab),最推荐通过修改本地 SSH 配置文件~/.ssh/config来区分不同仓库的密钥。适用场景为同一台设备需要切换不同身份提交代码,风险边界在于配置文件权限必须设置为 600 且远程仓库地址需对应修改为 SSH 协议。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在单台电脑上管理多个 Git 账户(如个人 GitHub 和公司 GitLab),最推荐通过修改本地 SSH 配置文件~/.ssh/config来区分不同仓库的密钥。适用场景为同一台设备需要切换不同身份提交代码,风险边界在于配置文件权限必须设置为 600 且远程仓库地址需对应修改为 SSH 协议。

先说结论:通过 SSH Config 别名映射不同 IdentityFile 是实现 Git 多账户隔离的标准方案,无需频繁切换全局配置。

  • 适合:同一台开发机需要同时登录多个 GitHub 或 GitLab 账户的场景。
  • 先准备:确保已生成多对 SSH 密钥公钥并分别添加到对应代码平台的账户设置中。
  • 验收:使用ssh -T命令测试不同 Host 别名能否成功握手并显示对应用户名。

命令速用版

直接在~/.ssh/config文件中添加如下配置片段,即可将不同域名或别名绑定到特定密钥文件。

Git 配置多账户 SSH key 区分不同仓库怎么设置
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 别名时,强制使用指定的私钥文件进行认证,从而实现账户隔离。

分步处理

按照以下顺序完成密钥生成、配置映射和仓库地址更新,每一步完成后需确认无误再进行下一步。

  1. 生成新密钥:运行ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_rsa_work,注意-f参数指定文件名以避免覆盖默认密钥。
  2. 添加公钥到平台:将生成的.pub公钥文件内容复制到对应 Git 平台的 SSH Keys 设置页面。
  3. 配置 SSH Config:编辑~/.ssh/config文件,若不存在则新建,写入 Host 映射规则,确保IdentityFile路径绝对正确。
  4. 修改仓库远程地址:进入本地仓库目录,执行git remote set-url origin git@github.com-work:username/repo.git,将默认域名替换为配置文件中定义的 Host 别名。

怎么验证是否生效

使用ssh -T命令连接配置的 Host 别名,观察返回信息中的用户名是否匹配预期账户。

Git 配置多账户 SSH key 区分不同仓库怎么设置
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。

Git 配置多账户 SSH key 区分不同仓库怎么设置

如何确认当前仓库使用的是哪个账户

执行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