https://www.jianshu.com/p/3fc93c16ad2d
创建日期:2020年4月6日
系统版本:macOS Mojave(V10.14.6)
本篇,Windows系统的电脑也通用,仅有一个linux的命令,需要自己调查。
1.创建SSH密钥
1.1 查看本机是否存在SSH keys,
$ ls ~/.ssh/
没有,则继续下一步;如果存在,则跳到【3.在GitHub账户中添加你的公钥】。
1.2 创建一对新的SSH密钥(keys)
$ssh-keygen -t rsa -C "[email protected]"
运行后,将按照你提供的邮箱,创建一对密钥,控制台出现的信息:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/userName/.ssh/id_rsa):
直接回车,则将密钥按默认文件进行存储。此时也可以输入特定的文件名,比如/c/Users/you/.ssh/github_rsa。直接回车后,会要求你输入密码:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
接着,根据提示,你需要输入密码和确认密码(说到这里,如果你很放心,其实可以不用密码,就是到输密码的地方,都直接回车,所以每次push就只管回车就行了。所谓的最安全的密码,就是没有密码 – – 哈哈)。密码设置完后,回车,会出现如下信息:(该图是从设置密钥开始的截图)
版本不同,可能出现的答案也不同,总之,没有出现错误提示,应该就是成功了。
1.3 在GitHub账户中添加你的公钥
运行如下命令,将公钥的内容复制到系统粘贴板(clipboard)中。
$ pbcopy < ~/.ssh/id_rsa.pub
#上面命令是Mac下的命令,windows方法相同,但是此命令不同
接着:
(1) 登陆GitHub,进入你的Account Settings.
点击你的头像,选择Settings,进入设置界面
(2) 在左边菜单,点击”SSH and GPG keys”。
(3) 点击”New SSH key”按钮.
(4) 粘贴你的密钥到key输入框中,点击"Add SSH key"按钮
(5) 再弹出窗口,输入你的GitHub密码,点击确认按钮。
(6) 到此,大功告成了!
1.4 测试
为了确认我们可以通过SSH连接GitHub,我们输入下面命令。输入后,会要求我们提供验证密码,输入之前创建的密码就ok了。
$ ssh -T [email protected]
你可能会看到告警信息,如下:
1.The authenticity of host 'github.com (207.97.227.239)' can't be established.
2.RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
3.Are you sure you want to continue connecting (yes/no)?
不用担心,直接输入yes。
如果看到下面信息,就说明一切完美!
Hi username! You’ve successfully authenticated, but GitHub does not provide shell access.
【注意】
如果前面没有将生成的密钥存放在默认的文件id_rsa中(而是my_rsa中),那么ssh -T [email protected]
命令就需要添加参数来执行。如下:
$ ssh -T -i my_rsa [email protected]
以上参考使用SSH密钥连接Github。
2、单机如何控制不同的SSH Keys连不同的Git环境?
其实,一套SSH密钥是可以用在不同的SSH环境的.
但是如果由于某种要求,需要用不同的SSH密钥连接不同的Git环境。假设具体场景是,已经建了密钥github_rsa,还需要创建work_rsa连接工作环境git仓库,那么,可以按下面操作进行:
2.1 创建第2个密钥
生成新的公钥,并命名为 id_rsa_2
(保证与之前密钥文件名称不同即可)
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_2 -C "[email protected]"
注意:这个邮箱是你另一个账户的邮箱。
2.2 创建config配置文件
在 .ssh
文件夹下新建 config
文件并编辑,
$ cd .ssh
$ vi config
(按i键,进入编辑模式。不了解vi编辑器的可以找到config的路径,用工具打开该文件,可视化编写)
另不同 Host 实际映射到同一 HostName
,但密钥文件不同。Host 前缀可自定义,例子中ieit
# default
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# two
Host ieit.github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_2
(按esc,再输入:wq
退出vi编辑器)
2.3 在GitHub账户中添加公钥
将生成的 id_rsa_2.pub
,id_rsa_2.pub
内容copy 到对应的 github中,参考【1.3 在GitHub账户中添加你的公钥】。
如果你是从第一步开始跟下来的,那么我们现在只要设置另一个github账户的SSH key即可。
将第二个账户的公钥内容复制到系统粘贴板上:
$ pbcopy < ~/.ssh/id_rsa_2.pub
2.4 测试 ssh 链接
ssh -T [email protected]
ssh -T [email protected]
# Hi IEIT! You've successfully authenticated, but GitHub does not provide shell access.
# 出现上边这句,表示链接成功。
(我第一次ieit用的自定义的大写字母,报错了,后来我把整个config文件copy过去,ieit用小写的自定义信息代替,成功了。因为在设置第二个账户的时候,我加了密码,因此会要求你输入密码。)
3、实际操作:建立本地仓库,关联远程仓库
(1) 将项目 clone
到本地, folder-name
是本地文件夹路径
git clone [email protected]:whatever folder-name
(2) 取消全局 用户名/邮箱设置,并进入项目文件夹单独设置
# 取消全局 用户名/邮箱 配置
git config --global --unset user.name
git config --global --unset user.email
# 单独设置每个repo 用户名/邮箱
git config user.email “[email protected]”
git config user.name “xxxx”
(3) 命令行进入项目目录,重建 origin
对克隆下来的文件,进行修改,如果可以push,则可以忽略此步骤。
git remote rm origin
git remote add origin [email protected]:whatever
【注意】
-
whatever
为相应项目地址,并且要是SSH项的地址,而非HTTPS的。如果误用了HTTPS的地址,可能会提示如下错误:
fatal: 不支持 '[email protected]:https' 协议
- 在粘贴
whatever
项时,一定要看好路径,github上,是带有[email protected]:
这一项的,我们要用config文件里对应的含前缀的那个,whatever
就是这一项后面那部分。如果不小心,把这部分整体作为whatever使用的话,会提示如下错误:
Enter passphrase for key '/Users/username/.ssh/id_rsa_2':
fatal: 远程错误:
is not a valid repository name
Email [email protected] for help
(4) 成功,可以 push 测试一下
git push origin master
之后,你可以按照上面方法,或者你熟悉的方法去设定其他账户关联的本地仓库。这里,主要注意的就是,取消全局git账户,然后在每个仓库中,配置自己对应仓库的user.email和user.name。
第二个账户的测试
上面的8,9,我都没有运行。原本第一个账户的代码,删除全局用户名/邮箱,改成单个项目里设置,没有push代码,但是pull代码,没有问题。
我从github上用git clone拉取公司项目的时候,只在第一次要求我输入账户和密码。之后都是好用的。我用同样的方法,拉取私人账户创建的仓库是,push的时候,一直提示权限问题。在设置ssh的时候,私人账户设置了密码,但是,应该与这个无关。于是,按照github上以及8,9的命令,又来了一次:
(1)在本地新建文件夹,进入该文件夹,运行下面的命令:
$ git init
# 往该文件夹里,拖入一个文件,我是用vi新建了一个README.md文件
$ git add .
$ git commit -am "first commit"
到此,有下面提示:
因为我们用两个账户,肯定不能设置全局的,先用命令看看当前的账户是什么
$ git config user.email
运行后,什么都不显示,说明我们并没有设置,现在开始设置邮箱和用户名:
$ git config user.name "Your Name"
$ git config user.email [email protected]
$ git remote add origin [email protected]:whatever
#记得把ieit换成你在config中设置的那个值
然后push,之后又出现了error:
fatal: 不支持 '[email protected]:https' 协议
调查后,说粘贴github的仓库地址时,用SSL的,不要用HTTPS的。重新运行之前的命令,会提示“[email protected]:ieit/aaaaaa.git”
于是,我们将上面的步骤再进行一次。待到push的时候,又出错了:
Enter passphrase for key '/Users/username/.ssh/id_rsa_2':
fatal: 远程错误:
is not a valid repository name
Email [email protected] for help
这个是命令错了。仔细观察,从一开始,使用SSH的url的时候,就一直用错了,要粘贴[email protected]:
后面的那段,因为前面这段我们已经变成config文件中自定义的[email protected]:
,因为没仔细看,折腾了好久。至此,终于成功了。
至此,我们直接clone的,应该也是可以,只是中途我填错了url而已。
另外,作者出现了gitignore没有该文件,确无法push的问题。最后解决的方案是把那个文件夹拖出,然后push到远程,再重新创建同名文件夹,将拖出的文件件的内容copy到新建立的文件夹,然后重新push。成功!
[参考](https://www.jianshu.com/p/3fc93c16ad2d)