如何管理多个 git 账号

4,558 阅读6分钟

问题

使用 git 时可能会遇到下面几种情况:

  • 当我们在一台电脑上既想要提交自己的代码至 github,又想提交公司的代码至 gitlab,甚至于提交代码至 oschina、码云、coding 等代码托管平台,但默认密钥只有一对(id_rsa与id_rsa.pub),怎么办?
    答:同一台电脑,代码托管至 N 个不同的平台,需要 N 个不同的 SSH key
    
  • 当我们在一台电脑上维护多个 github 账号下的仓库,但默认密钥只有一对,怎么办?
    答:同一台电脑,代码托管至同一个平台的 N 个不同账号,需要 N 个不同的 SSH key
    
  • 当我们在不同的电脑上维护同一个 github 账号下的仓库,但默认密钥只有一对,怎么办?
    答:同一个 github 账号,在 N 台电脑上,需要 N 个该 github 账号的 SSH key
    

思路

综上,我们需要生成多对 SSH keys

但在开始之前,我们要先做一件事,也是为了后面 push 时能区分 git 账户以推送至不同的仓库

  1. 查看 git 配置
    // 查看git所有配置
    git config --list
    
    // 查看git全局配置
    git config --global --list
    
  2. 取消 git 全局用户名与邮箱即可
    git config --global --unset user.name
    git config --global --unset user.email
    
  3. 以后要为每个仓库单独设置用户名与邮箱,不要再加 --global
    // 在每一个项目的根目录下打开终端
    git config user.name "git用户名"
    git config user.email "git邮箱"
    

电脑上的 SSH key 都存放在哪里?

一般来说,一台电脑默认只有一对密钥:私钥 id_rsa公钥 id_rsa.pub

  • windows 系统下的 .ssh 文件夹是在 C:\Users\Administrator\.ssh 这个目录下 {: width="100px" height="100px"}

  • macOS系统的.ssh文件夹是在根目录下~/.ssh,但它是隐藏文件夹,在finder中是直接看不到,我们需要在终端中输入指令 open ~/.ssh 打开(快捷键 command+shift+. 可以显示or隐藏该目录下的隐藏资源)

生成多个SSH keys

如果你还没有使用 ssh 克隆过项目,甚至没有配置过任何git账号,请参考《github设置添加ssh》

  1. cd到.ssh目录下,按下列指令生成新的SSH key
    • ssh-keygen -t rsa -C "git邮箱"
    • 以前是直接三个回车了事,现在需要重命名了,否则又会直接生成 id_rsa 与 id_rsa_pub,覆盖掉以前的SSH key,因为回车默认都是生成 id_rsa 与 id_rsa_pub
  2. 按照上图生成其余SSH keys,不同的平台git邮箱地址可以相同,但一定切记,要把 id_rsa 重命名为不同的名字,命名规则参考 id_rsa_xxid_rsa_xx.pub 的格式
  3. 如果一开始不是在.ssh目录下执行ssh-keygen -t rsa -C "账号邮箱",可能需要手动将生成的id_rsa_xxid_rsa_xx.pub文件统统都移至.ssh文件夹里,且.ssh文件夹里只含这4个文件,后续会自动生成known_hosts文件

添加私钥

默认SSH只会读取id_rsa,所以为了让SSH识别新的私钥id_rsa_xx,需要将其添加到SSH agent

  1. windows环境下,需要先打开ssh-agent,执行ssh-agent bash,直接添加私钥可能会报错Could not open a connection to your authentication agent.

  2. macOS环境下,其实可以略过

  3. 使用指令 ssh-add ~/.ssh/id_rsa_xx 添加新的私钥

    • windows如下图
    • macOS如下图
  4. ssh-add的其他命令参数

    ssh-add -D 删除ssh-agent中的所有密钥
    ssh-add -d 删除ssh-agent中的所有密钥
    ssh-add -L 删除ssh-agent中的所有密钥
    ssh-add -l 删除ssh-agent中的所有密钥
    

配置config文件

  1. 在.ssh文件夹中手动创建config文件,并按下面的模板填写

    # 配置
    Host 自定义别名,随意,但会影响git相关命令(建议取账号user.name 或 账号邮箱user.email)
    HostName 远程仓库真实域名(github.com或git.oschina.net) 或 ip地址
    PreferredAuthentications publickey
    IdentityFile 本地私钥id_rsa的路径
    User 配置使用用户名,写账号user.name或写git就行
    # Port 端口号(默认22)
    
  2. 配置完如下

  3. 如果是配置hexo博客,可以参考如下配置

New SSH key

  1. 将本地的公钥 id_rsa_xx.pub 分别添加至对应的平台账号中,这里以github为例,点击个人头像,Settings -> SSH and GPG keys -> New SSH key
  2. 找到想要配置的公钥
  3. 双击打开,拷贝ssh-rsa开头的一串字符
  4. Title随意起名,Key中粘贴上刚才拷贝的那串公钥
  5. 可能需要出入密码,现在私钥已添加完毕

远程测试

  1. windows平台,打开Git Bash客户端(管理员身份运行),macOS平台,打开terminal终端
  2. 如果本地只有一个SSH key,即没有配置config文件,则执行测试命令ssh -T git@Host Name 测试github公钥设置是否成功,如果钥匙变亮了,说明配置成功了,这个命令会自动在.ssh目录生成known_hosts文件并把私钥配置进去
    • ssh -T git@192.168.27.252
    • ssh -T git@10.13.0.176
    • ssh -T git@github.com
    • ssh -T git@git.oschina.net
  3. 如果本地有多个SSH keys,即有配置config文件(对于同一台电脑,有多个git账号需要维护的),则执行测试命令ssh -T git@Host
  4. 对于hexo博客,也可以直接ssh -T Host 或者使用ssh git@Host
  5. 如果在验证时遇到 Host key verification failed的问题 image.png 怎么办?直接输入 ssh-keygen -R [HostName] image.png

之前的老项目需要修改远程仓库URL

我们配置完多个SSH keys之后,以前按默认SSH克隆下来的项目,就不能直接git pull,这会要求你输入密码

这是为什么呢?因为我们在config文件使用了Host别名!!!

怎么办?重新克隆项目!哈哈,开玩笑,当然这也是一个办法,但注意不能再以之前默认的SSH去克隆项目了,需要做些修改,下面会讲到。

解决老项目git pull需要输入密码的问题,这里有两种办法:

  • 一是直接修改远程仓库的URL git remote set-url origin git@Host别名:gitrepo
  • 二是先remote rmremote add git remote rm origin git remote add origin git@Host别名:gitrepo

将远程github仓库克隆到本地

现在电脑上有不止一个密钥,此时输入的克隆命令有所不同,必须使用git clone git@Host自定义别名

git clone git@192.168.27.252:6-sports/clients/app6sports.git
改为
git clone git@yudesports:6-sports/clients/app6sports.git
git clone git@github.com:spp90s/vueBuy.git
改为
git clone git@spp90s:spp90s/vueBuy.git

git@后面紧跟的就是我们手动添加的config配置文件里的对应别名Host

如果您仍坚持使用默认的git clone git@github.com:gitrepo地址,可能会报错,比如下面这样,但如果git@后面换成我们在config文件中的Host别名,就能顺利克隆下来了