如何优雅地管理多个 GitHub 账户的 SSH 密钥

48 阅读5分钟

在日常开发中,我们常常需要同时使用多个 GitHub 账户,例如一个用于个人开源项目的个人账户,另一个用于公司业务的工作账户。当在同一台机器上管理这两个账户时,如何配置 SSH 密钥以实现免密、无缝的 git 操作就成了一个常见问题。

本文将记录自己一个完整、清晰的解决方案,通过配置独立的 SSH 密钥和 SSH 配置文件,让您可以在不同账户之间轻松切换。

核心思路

解决这个问题的核心思路是:

  1. 为每个 GitHub 账户创建一对独立的 SSH 密钥(公钥和私钥)。
  2. 将每个公钥分别添加到对应的 GitHub 账户中
  3. 创建一个 SSH 配置文件 (~/.ssh/config),告知系统在连接不同仓库时应使用哪一个私钥进行身份验证。

详细步骤

第一步:为每个账户生成独立的 SSH 密钥对

首先,我们需要为每个账户生成独一无二的 SSH 密钥文件,以避免相互覆盖。

  1. 打开您的终端(Terminal)或 Git Bash。

  2. 为您的 个人账户 生成 SSH 密钥。 使用 -f 参数指定一个有意义的文件名,例如 id_ed25519_personal

    # 将 your_personal_email@example.com 替换为您的个人邮箱
    ssh-keygen -t ed25519 -C "your_personal_email@example.com" -f ~/.ssh/id_ed25519_personal
    

    当系统提示输入密码(passphrase)时,您可以直接按 Enter 跳过,也可以设置一个密码来增强安全性。

  3. 为您的 工作账户 生成 SSH 密钥。 确保使用不同的邮箱和文件名,例如 id_ed25519_work

    # 将 your_work_email@example.com 替换为您的工作邮箱
    ssh-keygen -t ed25519 -C "your_work_email@example.com" -f ~/.ssh/id_ed25519_work
    

执行完毕后,您的 ~/.ssh 目录下应该包含以下新文件:

  • id_ed25519_personal (私钥)
  • id_ed25519_personal.pub (公钥)
  • id_ed25519_work (私钥)
  • id_ed25519_work.pub (公钥)

注意:私钥(没有 .pub 后缀的文件)是您的身份凭证,绝不能泄露给任何人

第二步:将公钥添加到对应的 GitHub 账户

接下来,需要将生成的公钥(.pub 文件)内容分别上传到对应的 GitHub 账户。

操作流程:

  1. 复制公钥内容 使用以下命令可以方便地将公钥内容复制到剪贴板:

    • 个人公钥:
      # macOS
      pbcopy < ~/.ssh/id_ed25519_personal.pub
      # Windows (Git Bash)
      clip < ~/.ssh/id_ed25519_personal.pub
      # Linux (需要安装 xclip)
      xclip -selection clipboard < ~/.ssh/id_ed25519_personal.pub
      
      如果命令无效,也可以用文本编辑器打开 .pub 文件并手动复制其全部内容。
  2. 登录您的个人 GitHub 账户

  3. 导航至 Settings > SSH and GPG keys

  4. 点击 New SSH key

  5. Title 字段中,输入一个描述性名称(例如,“Personal MacBook Pro”)。

  6. Key 字段中,粘贴您刚刚复制的公钥内容。

  7. 点击 Add SSH key

对您的工作账户重复以上所有步骤,但请确保复制和添加的是工作账户的公钥id_ed25519_work.pub)。

第三步:创建并配置 SSH 配置文件

这是让一切自动化工作的关键。我们将创建一个 config 文件来定义规则。

  1. 在终端中,创建(如果不存在的话)并打开 ~/.ssh/config 文件:

    touch ~/.ssh/config
    # 使用你喜欢的编辑器打开,例如 nano 或 VS Code
    nano ~/.ssh/config
    
  2. 将以下内容粘贴到该文件中:

    # 个人 GitHub 账户配置
    Host github.com-personal
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_ed25519_personal
        IdentitiesOnly yes
    
    # 工作 GitHub 账户配置
    Host github.com-work
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_ed25519_work
        IdentitiesOnly yes
    
  3. 保存并关闭文件。

配置文件解析:

  • Host: 一个自定义的别名。我们将用这个别名来代替 github.com
  • HostName: 实际的服务器地址,始终是 github.com
  • User: 使用的用户名,对于 GitHub SSH 连接,通常是 git
  • IdentityFile: 指定使用此 Host 别名时,应加载的私钥文件路径。
  • IdentitiesOnly yes: 强制 SSH 仅使用我们在 IdentityFile 中指定的密钥。

第四步:验证 SSH 连接

现在,我们可以测试每个配置是否能成功连接到 GitHub。

  • 测试个人账户连接

    ssh -T git@github.com-personal
    

    如果成功,您会看到包含您个人用户名的欢迎信息: Hi personal-username! You've successfully authenticated, but GitHub does not provide shell access.

  • 测试工作账户连接

    ssh -T git@github.com-work
    

    如果成功,您会看到包含您工作用户名的欢迎信息: Hi work-username! You've successfully authenticated, but GitHub does not provide shell access.

实际应用:如何使用新配置

配置完成后,与 GitHub 仓库交互的方式需要做一点小小的调整。

克隆新仓库

克隆仓库时,需要将原始 SSH URL 中的 github.com 替换为您在 config 文件中设置的对应 Host 别名。

  • 克隆个人仓库

    # 原始 URL: git@github.com:personal-username/repo-name.git
    # 修改后:
    git clone git@github.com-personal:personal-username/repo-name.git
    
  • 克隆工作仓库

    # 原始 URL: git@github.com:work-username/project-name.git
    # 修改后:
    git clone git@github.com-work:work-username/project-name.git
    

更新已存在的本地仓库

如果您的本地已经存在一个仓库,需要更新其远程 URL。

  1. 进入该仓库的目录:

    cd /path/to/your/repo
    
  2. 使用 git remote set-url 命令更新 origin 的 URL。

    • 更新为个人账户 URL
      git remote set-url origin git@github.com-personal:personal-username/repo-name.git
      
    • 更新为工作账户 URL
      git remote set-url origin git@github.com-work:work-username/project-name.git
      
  3. 使用 git remote -v 命令检查 URL 是否已成功更新。

附录:为不同仓库配置独立的 Git 用户名和邮箱

当您在不同项目之间切换时,确保您的 git commit 也使用正确的身份信息(用户名和邮箱)至关重要。

进入您的本地仓库目录后,使用 --local 参数为该仓库单独设置用户信息。

  • 在个人项目仓库中

    cd /path/to/personal-repo
    git config --local user.name "Your Personal Name"
    git config --local user.email "your_personal_email@example.com"
    
  • 在工作项目仓库中

    cd /path/to/work-repo
    git config --local user.name "Your Work Name"
    git config --local user.email "your_work_email@example.com"
    

这样可以确保您的提交记录归属于正确的身份,保持个人项目和工作项目的清晰分离。