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

文章导读
最稳妥的做法是通过 SSH 配置文件区分不同宿主对应的密钥,而不是频繁切换全局密钥。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

最稳妥的做法是通过 SSH 配置文件区分不同宿主对应的密钥,而不是频繁切换全局密钥。

先说结论:利用 SSH 客户端的 Config 文件为不同域名绑定不同 IdentityFile,实现自动匹配。

  • 适合:同时维护个人 GitHub 和公司 GitLab 等多个账户的场景
  • 先准备:生成独立的密钥对并确认公钥已添加到对应平台
  • 验收:使用 ssh -T 命令测试不同 Host 别名是否识别正确身份

命令速用版

# 生成公司密钥(注释带上邮箱便于区分)
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/id_ed25519_work

# 编辑 SSH 配置文件
vim ~/.ssh/config

# 测试连接(看到 welcome 字样即成功)
ssh -T git@github-work

为什么会这样

Git 本身不管理密钥,它调用系统的 SSH 客户端进行通信。默认情况下,SSH 会尝试使用 ~/.ssh/id_rsa 或 id_ed25519 等默认密钥。当多个账户需要不同密钥时,如果不加干预,SSH 可能会错误地发送个人密钥去请求公司仓库,导致 Permission denied。

通过配置 ~/.ssh/config,我们可以告诉 SSH 客户端:当访问特定 Host 别名时,强制使用指定的私钥文件。Git 远程地址中的域名部分改成这个别名,就能间接实现密钥隔离。

分步处理

1. 生成新密钥对
如果已有密钥可跳过,但建议为公司账户生成独立文件,避免混淆。

Git怎么配置多账户SSH key区分不同公司仓库?
ssh-keygen -t ed25519 -C "your_work_email@company.com" -f ~/.ssh/id_ed25519_work

按提示输入 passphrase(可选),生成后会将公钥 ~/.ssh/id_ed25519_work.pub 内容添加到公司 Git 平台的 SSH Keys 设置中。

2. 配置 SSH Config
编辑 ~/.ssh/config 文件,如果没有则新建。注意权限需为 600。

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal

Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work

这里 Host 是自定义别名,HostName 是真实服务器地址。个人账号沿用原域名,公司账号使用别名。

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

3. 添加密钥到代理
确保 ssh-agent 加载了新密钥,否则每次连接都可能失败。

ssh-add ~/.ssh/id_ed25519_work

4. 修改 Git 远程地址
进入公司仓库目录,将 remote URL 中的域名改为配置的 Host 别名。

git remote set-url origin git@github-work:username/repo.git

怎么验证是否生效

使用 verbose 模式测试 SSH 连接,观察使用的密钥文件路径。

ssh -T -v git@github-work

输出日志中寻找 Offering public key: .../id_ed25519_work 字样。如果看到 Hi xxx! You've successfully authenticated,说明身份识别正确。

常见坑

  • 文件权限错误:~/.ssh/config 权限必须是 600,私钥文件也必须是 600,否则 SSH 会忽略配置或报错。
  • Host 混淆:Git 远程地址必须匹配 Config 中的 Host 字段,而不是 HostName。
  • 缓存干扰:修改配置后,如果 ssh-agent 缓存了旧密钥,可能需要先 ssh-add -D 清除缓存再重新添加。
  • 大小写敏感:部分 Git 服务对 URL 中的用户名大小写敏感,配置时保持一致。

参考来源

  • 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.5