问题
使用 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 账户以推送至不同的仓库
- 查看 git 配置
// 查看git所有配置 git config --list // 查看git全局配置 git config --global --list
- 取消 git 全局用户名与邮箱即可
git config --global --unset user.name git config --global --unset user.email
- 以后要为每个仓库单独设置用户名与邮箱,不要再加
--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》
- cd到.ssh目录下,按下列指令生成新的SSH key
ssh-keygen -t rsa -C "git邮箱"
- 以前是直接三个回车了事,现在需要重命名了,否则又会直接生成 id_rsa 与 id_rsa_pub,覆盖掉以前的SSH key,因为回车默认都是生成 id_rsa 与 id_rsa_pub
- 按照上图生成其余SSH keys,不同的平台git邮箱地址可以相同,但一定切记,要把 id_rsa 重命名为不同的名字,命名规则参考
id_rsa_xx
与id_rsa_xx.pub
的格式 - 如果一开始不是在.ssh目录下执行
ssh-keygen -t rsa -C "账号邮箱"
,可能需要手动将生成的id_rsa_xx
与id_rsa_xx.pub
文件统统都移至.ssh文件夹里,且.ssh文件夹里只含这4个文件,后续会自动生成known_hosts文件
添加私钥
默认SSH只会读取id_rsa,所以为了让SSH识别新的私钥id_rsa_xx,需要将其添加到SSH agent
-
windows环境下,需要先打开ssh-agent,执行
ssh-agent bash
,直接添加私钥可能会报错Could not open a connection to your authentication agent.
-
macOS环境下,其实可以略过
-
使用指令
ssh-add ~/.ssh/id_rsa_xx
添加新的私钥- windows如下图
- macOS如下图
- windows如下图
-
ssh-add的其他命令参数
ssh-add -D 删除ssh-agent中的所有密钥 ssh-add -d 删除ssh-agent中的所有密钥 ssh-add -L 删除ssh-agent中的所有密钥 ssh-add -l 删除ssh-agent中的所有密钥
配置config文件
-
在.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)
-
配置完如下
-
如果是配置hexo博客,可以参考如下配置
New SSH key
- 将本地的公钥
id_rsa_xx.pub
分别添加至对应的平台账号中,这里以github为例,点击个人头像,Settings -> SSH and GPG keys -> New SSH key - 找到想要配置的公钥
- 双击打开,拷贝ssh-rsa开头的一串字符
- Title随意起名,Key中粘贴上刚才拷贝的那串公钥
- 可能需要出入密码,现在私钥已添加完毕
远程测试
- windows平台,打开Git Bash客户端(管理员身份运行),macOS平台,打开terminal终端
- 如果本地只有一个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
- 如果本地有多个SSH keys,即有配置config文件(对于同一台电脑,有多个git账号需要维护的),则执行测试命令
ssh -T git@Host
- 对于hexo博客,也可以直接
ssh -T Host
或者使用
ssh git@Host
- 如果在验证时遇到
Host key verification failed
的问题怎么办?直接输入
ssh-keygen -R [HostName]
之前的老项目需要修改远程仓库URL
我们配置完多个SSH keys之后,以前按默认SSH克隆下来的项目,就不能直接git pull
,这会要求你输入密码
这是为什么呢?因为我们在config文件使用了Host别名!!!
怎么办?重新克隆项目!哈哈,开玩笑,当然这也是一个办法,但注意不能再以之前默认的SSH去克隆项目了,需要做些修改,下面会讲到。
解决老项目git pull
需要输入密码的问题,这里有两种办法:
- 一是直接修改远程仓库的URL
git remote set-url origin git@Host别名:gitrepo
- 二是先
remote rm
再remote 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别名,就能顺利克隆下来了