在我一开始使用git来管理github上的项目时,所有可以搜到的入门教程,基本开始都会让你设置下面这样
$ git config --global user.name "your name"
$ git config --global user.email "your_email@youremail.com"
很多都只有设置全局用户名和密码,而没有提及ssh key的方式。
实际上,不管时设置用户名和密码,还是生成ssh key,其实都是Git的文件传输协议。
经常可以看到和git相关的几个词语,包括:github、gitlab以及gitee,简要介绍一下区别:
GitLabInc.
开发,可以用GitLab自己搭建一个类似于GitHub一样的仓库,但GitLab有完善的管理界面和权限控制,一般用于在企业、学校等内部网络搭建Git私服。OSCHINA.NET
推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管。另外,git和svn都属于开源版本控制系统 (version control system,VCS)
SVN的特点:
Git的特点:
建议:
参考:
为了可以实现协作功能,需要一个远程的Git仓库,
下面简要介绍本地协议和Git协议,着重介绍常用的http协议和ssh协议。
官方文档介绍有两种,
智能 HTTP 的运行方式和 SSH 及 Git 协议类似,只是运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验证机制, 这意味着使用起来会比 SSH 协议简单的多,可以使用 HTTP 协议的用户名/密码授权,免去设置 SSH 公钥。
其像 SSH 协议一样提供传输时的授权和加密, 而且只用一个 URL 就可以都做到,省去了为不同的需求设置不同的 URL。
如果你要推送到一个需要授权的服务器上(一般来讲都需要),服务器会提示你输入用户名和密码。 从服务器获取数据时也一样。
优点:
缺点:
架设 Git 服务器时常用 SSH 协议作为传输协议。 因为大多数环境下服务器已经支持通过 SSH 访问 —— 即使没有也很容易架设。 SSH 协议也是一个验证授权的网络协议;并且,因为其普遍性,架设和使用都很容易。
通过 SSH 协议克隆版本库,你可以指定一个 ssh:// 的 URL
:
$ git clone ssh://[user@]server/project.git
# 或者使用一个简短的 scp 式的写法:
$ git clone [user@]server:project.git
最基本的就是 本地协议(Local protocol)
,其中的远程版本库
就是同一主机上的另一个目录,或者是使用共享文件系统进行的文件管理和访问(一般在同一局域网络中)
共享文件系统,常见的有NFS和Samba,
- NFS主要用于Linux/Unix平台下,
- 而Samba用于将linux/Unix平台下的文件映射到Window系统网络邻居上,用于实现Linux/Unix到Window平台的共享,当然,它也可以实现Linux/Unix平台之间的文件共享
使用共享文件系统,就可以从本地版本库克隆(clone)、推送(push)以及拉取(pull)。 克隆一个版本库或者增加一个远程到现有的项目中,使用版本库路径作为 URL。例如:
$ git clone /srv/git/project.git
$ git clone file:///srv/git/project.git
只是资源表示url的方式和常见的http形式有所不同。
Git 协议:是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。
优点:Git 协议是 Git 使用的网络传输协议里最快的。 如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。
缺点:Git 协议缺点是缺乏授权机制。
CLI
命令行界面(Command Line Interface for batch scripting)
为什么生成ssh秘钥就可以使用git,但是还要另外再配用户名和密码,使用http协议?
根据 Github docs-在 Git 中设置用户名可知:
- Git 使用用户名将提交与身份关联。
- Git 用户名与您的 GitHub 用户名不同。(是两种系统的用户名,但是可以起一样的,只要你愿意)
- 可以使用 git config 命令更改与您的 Git 提交关联的名称。
- 设置的新名称将在从命令行推送到 GitHub 的任何未来提交中显示。 如果您想要将真实姓名保密,则可以使用任意文本作为您的 Git 用户名。
使用 git config 更改与 Git 提交关联的名称仅影响未来的提交,不会更改用于过去提交的名称。
# 为计算机上的每个仓库设置 Git 用户名 使用--global参数
$ git config --global user.name "your name"
# 确认正确设置
$ git config --global user.name
> Mona Lisa$ git config --global user.email "your_email@youremail.com"# 为一个仓库设置 Git 用户名
$ git config user.name "Mona Lisa"
# 确认正确设置了用户名
$ git config user.name
> Mona Lisa
使用git设置名字,是因为commit时候会使用,可以在gitlab/github每个版本的提交中看到某个版本的提交者是谁,那个就是git设置的名字,而github的名字就是用户名。类似:
在日常使用的时候,除了授权,输入用户名密码或者输入SSH key的时候有区别,其他时候感觉不到有什么区别。
参考:
(一般的博客都写的是使用区别,一个需要输入用户名密码,另一个不需要。。。官方文档里有偏向原理性的解释)
学习git最好的两个文档:
之前一直是用户名密码登录,但是今天收到了这样的提示:
没办法,就换一下吧。
参考:github关于使用ssh连接的文档
在CLI中输入:
$ ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist
如果是mac或者linux,可以直接找到这个文件
打开其中的known_hosts
,这里就是我机器上存放key的地方,会有类似:id_rsa.pub、id_ecdsa.pub、id_ed25519.pub这样的字眼。
如果不想使用已有的key,可以新生成一组,比如:
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-keygen -t ed25519 -C "hs8023hfp@gmail.com"
其中,ed25519是一种数字签名算法,如果系统 OpenSSH 版本低于 6.5(2014 年的古早版本),不支持这个算法,则可以使用下面代码来生成
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Generating public/private ed25519 key pair.
Enter a file in which to save the key (/Users/you/.ssh/id_ed25519): [Press enter]
,问你这个key要存在哪里,直接按下Enter,就会保存在默认位置。Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]
# 在后台启动 ssh-agent
$ eval "$(ssh-agent -s)"
> Agent pid 59566
# pid表示这个ssh-agent进程的进程ID# 如果您使用的是 macOS Sierra 10.12.2 或更高版本,则需要修改您的~/.ssh/config文件以自动将密钥加载到 ssh-agent 中并将密码存储在您的钥匙串中。#首先,检查~/.ssh/config文件是否存在于默认位置。
$ open ~/.ssh/config
> The file /Users/you/.ssh/config does not exist.# 不存在,创建该文件。
$ touch ~/.ssh/config# 打开~/.ssh/config文件,添加以下内容。如果SSH 密钥文件的名称或路径与示例代码不同,请修改文件名或路径以匹配您当前的设置。Host *AddKeysToAgent yesUseKeychain yesIdentityFile ~/.ssh/id_ed25519# 将您的 SSH 私钥添加到 ssh-agent 并将您的密码存储在钥匙串中。如果您使用不同的名称创建了密钥,或者如果您要添加具有不同名称的现有密钥,请将命令中的id_ed25519替换为您的私钥文件的名称。
$ ssh-add -K ~/.ssh/id_ed25519
> Identity added: /Users/huangshan/.ssh/id_ed25519 (hs8023hfp@gmail.com)
直接打开刚刚的id_ed25519.pub
,复制全部内容
或者使用以下代码:
$ pbcopy < ~/.ssh/id_ed25519.pub
# Copies the contents of the id_ed25519.pub file to your clipboard
然后打开网页的github&#xff0c;找到setitngs
然后SSH and GPG keys.
&#xff0c;
然后就是New SSH key
或者Add SSH key.
起个名字&#xff0c;把刚刚复制的内容粘贴到key里&#xff0c;然后点击Add SSH key.
。就好了&#xff0c;可能还会让输入密码确认一下。
$ ssh -T git&#64;github.com
# Attempts to ssh to GitHub# 然后会提示
> The authenticity of host &#39;github.com (IP ADDRESS)&#39; can&#39;t be established.
> RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
> Are you sure you want to continue connecting (yes/no)?
注意&#xff0c;上面的RSA key fingerprint
并不是指自己刚刚配置的ssh key&#xff0c;而是用于测试的公用key&#xff0c;包括以下&#xff1a;
# 当前的R SA key fingerprint
SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 (RSA)# 下面的从2021.9.14起支持
SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM (ECDSA)
SHA256:&#43;DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU (Ed25519)# 下面这个2021.9.16会停用
SHA256:br9IjFspm1vxR3iA35FWE&#43;4VTyz1hYVLIE2t1/CeyWQ (DSA)
然后核对之后没问题&#xff0c;就输入yes
就好了。然后就会提示&#xff1a;
Warning: Permanently added &#39;github.com,192.30.255.112&#39; (RSA) to the list of known hosts.
Hi &#96;username&#96;! You&#39;ve successfully authenticated, but GitHub does not provide shell access.
这个时候&#xff0c;就算添加好了。