0%

Git 学习笔记(1)管理一台电脑上的多个公钥

  1. 1. 前提条件
  2. 2. 创建公钥
  3. 3. 添加公钥到远程仓库
  4. 4. 管理多个公钥
    1. 简要原理
    2. 归纳:push和clone

1. 前提条件

安装 Git,参考:

廖雪峰老师的 Git 教程
Git 官网

2. 创建公钥

打开.ssh文件夹(位于:C:\Users\Administrator\.ssh),右键文件夹空白处,打开 Git BashGit Bash here

创建命令:

1
$ssh-keygen -t rsa -C "emailname@example.com" # 邮箱名自定

设置存储公钥的文件名:(可以直接回车跳过,默认文件名为id_rsa

1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/325-43/.ssh/id_rsa): id_rsa_rswork

之后设置密码啥的直接跳过就可以了(如果不是特别必要的话)。

3. 添加公钥到远程仓库

公钥的所有内容(一大串以我们设置的邮箱结尾的字符串)都存放在.pub文件中,添加到对应的远程仓库就可以啦。

4. 管理多个公钥

此时有两个公钥:

在这里插入图片描述

在同一个平台(GitHub,GitLab,码云……)下,一个本地公钥只能给一个账户使用,但是多个平台的账户可以共用一个本地公钥。因此,当需要使用一个平台下的多个账号时(例如一个人使用多个账号参与多个项目),如果直接进行clonepush操作时,会提示:Access Denied

1
2
3
4
5
6
7
$git clone git@gitee.com:XXX/xxx.git
Cloning into 'xxx'...
Access denied: Access Denied
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

在默认情况下,Git 会检验.ssh文件中 id_rsa.pub 的公钥对于 clonepush 的仓库的可访问性,当出现多个公钥时,我们就需要告诉 Git 如何使用正确的公钥来访问项目。

比如现在,我所访问的这个项目是一个私有项目,而我已经将 id_rsa_rswork.pub 中的公钥添加到了该账号下的ssh中了,然而直接clone依旧提示Access Denied,说明 Git 并没有正确使用公钥,我们打开.ssh文件夹,在文件夹下创建文件 config,在里面写入:

1
2
3
4
HOST pubKey1
HostName gitee.com
User git
IdentityFile ~/.ssh/id_rsa_rswork

保存,退出。其中,pubKey1是自定义的变量名,用于告诉 Git 应该使用哪个公钥

此时我们使用如下命令来克隆仓库:

1
$git clone pubKey1:XXX/xxx.git

成功。

简要原理

当我们 clonepush 不同账户或不同平台仓库时,我们希望能控制在不同的地方使用不同的公钥

注意到仓库提供的克隆 ssh 为:(XXX是账户名,xxx是仓库名,git@gitee.com 指定了远程仓库的地址,config文件中的User和HostName分别对应这里的gitgitee.com

1
2
git@gitee.com:XXX/xxx.git  # 码云
git@github.com:XXX/xxx.git # github

当我们使用官方提供的标识信息时,默认只读取 .ssh 文件夹下 id_rsa.pub 中的公钥。

config

1
2
3
4
HOST pubKey1
HostName gitee.com
User git
IdentityFile ~/.ssh/id_rsa_rswork

配置文件 config 的内容大致呈 1 + 3的结构, HOST 类似于变量名,该变量下由HostNameUser来定义标识信息,IdentityFile 则声明了公钥的位置,因此我们可以使用如下命令来克隆仓库:

1
$git clone pubKey1:XXX/xxx.git

归纳:push和clone

指定公钥后,相应的pushclone操作如下:

1
2
3
4
5
6
7
8
9
$git 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