1. 前提条件
安装 Git,参考:
2. 创建公钥
打开.ssh
文件夹(位于:C:\Users\Administrator\.ssh),右键文件夹空白处,打开 Git Bash
(Git Bash here)
创建命令:
1 | ssh-keygen -t rsa -C "emailname@example.com" # 邮箱名自定 |
设置存储公钥的文件名:(可以直接回车跳过,默认文件名为id_rsa)
1 | Generating public/private rsa key pair. |
之后设置密码啥的直接跳过就可以了(如果不是特别必要的话)。
3. 添加公钥到远程仓库
公钥的所有内容(一大串以我们设置的邮箱结尾的字符串)都存放在.pub
文件中,添加到对应的远程仓库就可以啦。
4. 管理多个公钥
此时有两个公钥:
在同一个平台(GitHub,GitLab,码云……)下,一个本地公钥只能给一个账户使用,但是多个平台的账户可以共用一个本地公钥。因此,当需要使用一个平台下的多个账号时(例如一个人使用多个账号参与多个项目),如果直接进行clone
或push
操作时,会提示:Access Denied
1 | git clone git@gitee.com:XXX/xxx.git |
在默认情况下,Git 会检验.ssh文件中 id_rsa.pub
的公钥对于 clone
或 push
的仓库的可访问性,当出现多个公钥时,我们就需要告诉 Git 如何使用正确的公钥来访问项目。
比如现在,我所访问的这个项目是一个私有项目,而我已经将 id_rsa_rswork.pub
中的公钥添加到了该账号下的ssh中了,然而直接clone依旧提示Access Denied
,说明 Git 并没有正确使用公钥,我们打开.ssh
文件夹,在文件夹下创建文件 config,在里面写入:
1 | HOST pubKey1 |
保存,退出。其中,pubKey1是自定义的变量名,用于告诉 Git 应该使用哪个公钥。
此时我们使用如下命令来克隆仓库:
1 | git clone pubKey1:XXX/xxx.git |
成功。
简要原理
当我们 clone
、push
不同账户或不同平台仓库时,我们希望能控制在不同的地方使用不同的公钥。
注意到仓库提供的克隆 ssh 为:(XXX是账户名,xxx是仓库名,git@gitee.com
指定了远程仓库的地址,config文件中的User和HostName分别对应这里的git
和gitee.com
)
1 | git@gitee.com:XXX/xxx.git # 码云 |
当我们使用官方提供的标识信息时,默认只读取 .ssh
文件夹下 id_rsa.pub
中的公钥。
config1
2
3
4HOST pubKey1
HostName gitee.com
User git
IdentityFile ~/.ssh/id_rsa_rswork
配置文件 config
的内容大致呈 1 + 3
的结构, HOST
类似于变量名,该变量下由HostName
和User
来定义标识信息,IdentityFile
则声明了公钥的位置,因此我们可以使用如下命令来克隆仓库:1
git clone pubKey1:XXX/xxx.git
归纳:push和clone
指定公钥后,相应的push
和clone
操作如下:1
2
3
4
5
6
7
8
9git clone pubKey1:XXX/xxx.git # clone
添加并查看远程仓库
git remote add gitee pubKey1:XXX/xxx.git
git remote -v
gitee pubKey1:XXX/xxx.git (fetch)
gitee pubKey1:XXX/xxx.git (push)
push
git push gitee master