问题引子
在新开发机上安装了Git,通过Https协议方式拉取项目后,每次git push的时候都提示输入用户名和密码 。
解决方案
在终端执行
git config --global credential.helper store或git config --global credential.helper manager或git config --global credential.helper cache启用凭证助手,存储校验通过后的Username和Passowrd,这样就只需最开始输入一次。启用方式区别在于,前两者是永久存储在磁盘中,而cache方式只会在内存中存储15分钟。以Window为例
原因分析
通常我们从Git上拉取项目,有Https和SSH两种方式。而通过Https的方式clone仓库后,对仓库的一些修改操作,比如说push,是需要终端用户提供用户名/密码授权信息的,而在本地没有保存授权信息的情况下,就只能每次都需要输入,所以Git为此提供了credential.helper(凭证助手),来管理凭证。
Git协议简介
Git支持多种通信协议,比较常用的还是Https、SSH<git>。
从授权机制上来说,Https采用用户名/密码验证方式,而SSH采用密钥认证的方式,用户在使用Git之前需要先在本地生成SSH密钥对,再把公钥上传到服务器。 从安全角度上来说,Https协议下除了对于一些敏感操作如push,需要验证外,大多数情况下都支持匿名访问Git仓库,不需要额外的验证,比如clone操作。而
SSH协议不支持匿名访问,即使是clone也需要验证。
使用SSH协议交互
上面说过,如果本地仓库与远程仓库,采用SSH协议进行通信,用户需要先在本地生成密钥对,然后将公钥上传到服务器。否则终端是无法进行clone项目、push等操作的。下面介绍一下采用SSH通信的步骤
1)在终端通过ssh-keygen成生成密钥对。-t
指定创建的密钥类型,主要有rsa和dsa两种; -C为comment。生成的私钥默认存储在$user/.ssh/id_rsa文件中,而公钥在id_rsa.pub文件中。
dell@DESKTOP-2JQIQ4F MINGW64 /f
$ ssh-keygen -t rsa -C "xxxxxxxxx@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/dell/.ssh/id_rsa):
/c/Users/dell/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/dell/.ssh/id_rsa
Your public key has been saved in /c/Users/dell/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:cQcmTV50f1vgFY5T/FUKXt+xB0yYyYf9e7Na1IbIEAQ xxxxxxxxx@qq.com
The key's randomart image is:
+---[RSA 3072]----+
| E=*o+OB+=|
| +.=*=BO=|
| . + o+o+X|
| o + ...O|
| S o .o+|
| .+.|
| .+|
| .. |
| .. |
+----[SHA256]-----+
dell@DESKTOP-2JQIQ4F MINGW64 /f
$ ll ~/.ssh
total 9
-rw-r--r-- 1 dell 197121 2610 7月 24 20:44 id_rsa
-rw-r--r-- 1 dell 197121 575 7月 24 20:44 id_rsa.pub
-rw-r--r-- 1 dell 197121 1197 7月 24 20:59 known_hosts
2)将密钥复制到远程服务器,如GitHub,然后就可以
3)测试,通过ssh协议clone一个项目,可以是任意一个项目。
dell@DESKTOP-2JQIQ4F MINGW64 /f
$ git clone git@github.com:ddqn/fn-zkclient.git
Cloning into 'fn-zkclient'...
remote: Enumerating objects: 15, done.
...