Git配置SSH Key

记录 Git 配置 SSH-Key 的过程,方便以后查阅。

HTTPS URL 和 SSH URL

在使用 git clone 项目时,可以使用仓库的 HTTPS URL 也可以 使用 SSH URL

  • HTTPS URL,例如:

    1
    https://github.com/<username>/<repo name>.git
  • SSH URL,例如:

    1
    git@github.com:<username>/<repo name>.git

这两种方式的主要区别在于:使用 HTTPS URL 克隆时,每次 fetch 和 push 代码都需要输入账号和密码,而使用 SSH URL 在配置好 SSH Key 后,每次 fetch 和 push 代码都不需要输入账号和密码。

初次运行 Git 前的配置

Git 环境变量

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

配置用户信息

初次运行 Git 前需要配置用户信息,一个是你个人的用户名称,一个是你的电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的 ~/.gitconfig 文件,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者邮箱,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

1
2
3
4
5
6
7
8
$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig~/.gitconfig ),不过最终 Git 实际采用的是最后一个。

也可以直接查阅某个环境变量的设定,只要把特定的环境变量名称跟在后面即可,例如:

1
2
$ git config user.name
Scott Chacon

检查是否已有 SSH Key

1
$ cd ~/.ssh

执行 lsll

1
2
$ ls
id_rsa id_rsa.pub known_hosts

看是否存在 id_rsa 和 id_rsa.pub 文件(或者是其它文件名),如果存在说明已有 ssh key,可以直接跳过生成密钥,其中 id_rsa 为私钥,id_rsa.pub 为公钥。

生成 SSH key

1
$ ssh-keygen -t rsa -C "your_email@example.com"
参数 描述
-t 指定密钥类型,默认是rsa,可以省略
-C 设置注释文字,比如邮箱
-f 指定密钥文件存储文件名

以上代码省略了 -f 参数,因此在运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key,例如:

1
2
3
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):

当然,你也可以不输入文件名,直接回车使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个密钥文件。

接着又会提示你输入两次密码(该密码是你 push 文件的时候要输入的密码,而不是 github 管理者的密码),当然,你也可以不输入密码,直接连续两次按回车。那么 push 的时候就不需要输入密码,直接提交到 github 上了,例如:

1
2
3
4
5
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

连续两次回车确认后,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in ~/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:1qRb99eh19t8bqtivWkuxpNLnwKzXIg1e1u2JASyMfU your_email@example.com
The key's randomart image is:
+---[RSA 2048]----+
| .. |
| + .. |
| = oE |
| . * . |
| S B . . |
| o B = =. +|
| o B.O.o.+|
| o.@.++o=|
| o.OBo=*|
+----[SHA256]-----+

看到以上 save 成功的提示,说明 SSH Key 已经创建成功,提示已经说明密钥文件已保存在 ~/.ssh 文件夹下。

添加 SSH Key 到 Github

登录 github,点击头像,点击 Settings 进入设置页面。

然后点击菜单栏的 SSH Key 进入页面添加 SSH Key。

github-ssh-keys

点击 New SSH Key 按钮后进行 Key 的填写,其中 Title 随意, Key 为刚刚生成的公钥,公钥在文件 id_rsa.pub 文件中,直接 copy 文件中的内容粘贴即可。

测试 SSH key

1
$ ssh -T git@github.com

当执行以上代码时,会有一段警告,如:

1
2
3
The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?

这是正常的,直接输入 yes 回车既可。如果你创建 SSH key 的时候设置了密码,接下来就会提示你输入密码,如:

1
Enter passphrase for key '~/.ssh/id_rsa':

当然如果你密码输错了,会再要求你输入,直到对了为止。注意:输入密码时如果输错一个字符就会不正确,使用删除键是无法更正的。正确输入密码后你会看到下面这段话,如:

1
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

如果用户名是正确的,你已经成功设置 SSH 密钥。如果你看到 "access denied" ,者表示拒绝访问,那么你就需要使用 HTTPS 去访问,而不是 SSH 。

References

https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%88%9D%E6%AC%A1%E8%BF%90%E8%A1%8C-Git-%E5%89%8D%E7%9A%84%E9%85%8D%E7%BD%AE

https://www.cnblogs.com/ayseeing/p/3572582.html