优雅实现 Git 多账号切换:基于 SSH Config 与 includeIf 的环境隔离方案

在日常开发中,我们经常需要在一台电脑上同时处理个人开源项目公司业务项目。最核心的痛点有两个:

  1. SSH Key 冲突:GitHub 默认只识别一对密钥,多账号如何无感切换?
  2. 提交身份混淆:如何在公司项目中自动使用公司邮箱,在个人项目中自动使用个人邮箱?

本文分享一种“一次配置,永久生效”的自动化方案。

1. 目录结构规划

首先,建议按用途将项目存放在不同的父目录下,这是自动化切换的前提。

1
2
3
Workspaces/
├── personal/ # 存放个人项目
└── company/ # 存放公司项目

2. 生成独立的 SSH 密钥

为每个账号生成专属的密钥对,不要覆盖默认的 id_ed25519

1
2
3
4
5
# 生成个人账号密钥
ssh-keygen -t ed25519 -C "personal@email.com" -f ~/.ssh/id_ed25519_personal

# 生成公司账号密钥
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_work

生成的 .pub 文件内容需分别上传至对应 GitHub 账号的 SSH Keys 设置中。

3. 配置 Git 身份自动切换

利用 Git 的 includeIf 特性,根据当前所在的文件夹自动加载不同的配置。

修改全局配置 ~/.gitconfig

1
2
3
4
5
6
7
8
9
10
11
[user]
name = YourName_Work
email = work@company.com

[core]
# 全局默认使用公司密钥
sshCommand = "ssh -i ~/.ssh/id_ed25519_work"

# 关键:当路径匹配 personal 文件夹时,加载额外配置
[includeIf "gitdir/i:~/Workspaces/personal/"]
path = ~/.gitconfig-personal

创建个人专属配置 ~/.gitconfig-personal

1
2
3
4
5
6
7
[user]
name = YourName_Personal
email = personal@email.com

[core]
# 强制在此目录下使用个人密钥
sshCommand = "ssh -i ~/.ssh/id_ed25519_personal"

4. 方案优势

  1. 无需修改 URL:不需要像传统的 SSH Alias 方案那样把 github.com 改成 github-personal,直接复制 GitHub 上的 git@github.com:... 即可克隆。
  2. 零误操作:只要进入了 personal 目录,所有的 git commit 都会自动关联个人邮箱,彻底避免用公司邮箱给开源社区提代码的尴尬。
  3. 兼容性强:该方案在终端、Neovim (LazyVim)、VS Code 等各类开发工具中均可完美生效。

5. 常见问题验证

配置完成后,可以通过以下命令验证:

1
2
3
4
5
6
7
8
# 进入项目目录
cd ~/Workspaces/personal/some-repo

# 验证邮箱切换
git config user.email

# 验证 SSH 密钥切换
ssh -T git@github.com