在上一节中,已经知道如何管理本地的代码了,在这一节中主要学习如何获取一个远程仓库的代码。为了方便大家的练习,在拉取代码的过程中可能会碰到鉴权方面的问题,这一节内容中同样会提到如何处理。

4.1 创建远程代码仓库

我们首先在代码托管平台码云上新建一个自己的测试版本库;

4.1.1 注册账号

首先,去代码托管平台 github 注册一个账号,然后在页面上登陆。

git-4-1

git-4-2

git-4-3

git-4-4

git-4-5

然后就各种Continue。

4.1.2 创建仓库

登陆之后,可以看到右上角有一个 创建仓库选项,我们点击创建仓库,如下图所示:

git-4-6

在创建仓库的表单中,简单填写一下信息即可,如下图所示:

git-4-7

填写完表单之后,点击表单下方的提交按钮,表单提交上去之后,就会给你建立一个远程仓库。

4.1.3 进入仓库

创建完毕之后,浏览器会自动跳转到仓库的地址,如下图所示

git-4-8

建立远程仓库之后,默认里面有几个文件;接下来我们通过 git 的命令将远程仓库拉取到本地,一般会提供 HTTP 协议和 SSH 两种协议提供管理,两种协议所使用的鉴权方式不同,下面我们将两种方法都实践一次;

4.2 HTTP (S) 获取远程仓库

HTTP 协议方式拉取代码相对来说比较简单,直接执行 git 的 clone 命令即可,不需要额外的配置,但相对 ssh 协议来说安全性较低。

4.2.1 首次拉取

HTTP 协议首次拉取代码的命令格式如下所示:

git clone 版本库地址	[本地文件夹名称]

假设我需要把刚才新建的仓库代码拉取到本地,并且本地的文件夹名称叫 httptest(也可以不指定本地文件夹名称,默认名字为远程仓库名字),参考命令如下所示

git clone https://github.com/jundongpei/startGit.git   httptest

因为我们之前创建的是公开的仓库,所以只直接就可以拉取下来。

 ✝ git clone https://github.com/jundongpei/startGit.git   httptest
正克隆到 'httptest'...
warning: 您似乎克隆了一个空仓库。

我们这里再创建一个私有的仓库试一下。

git-4-9

再次执行命令clone命令,会要求你输入用户名和密码,只有当你输入正确的用户名和密码之后代码才能正常拉取。

 ✝ git clone https://github.com/jundongpei/privateStartGit.git privateStartGit
正克隆到 'privateStartGit'...
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com':
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: 'https://github.com/jundongpei/privateStartGit.git/' 鉴权失败

但是Github已经在8月13号不允许使用用户名和密码的方式认证了。我们需要创建一个Token。代替密码来完成认证。关于如何创建有一个 access tokens这里就不展开了,可以参考这个文档。

https://docs.github.com/cn/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token

创建一个 access tokens之后我们在来试验一下,输入密码的地方,我们要输入自己创建的Token。

 ✝ git clone https://github.com/jundongpei/privateStartGit.git privateStartGit
正克隆到 'privateStartGit'...
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com':这里输入的Token
warning: 您似乎克隆了一个空仓库。

4.2.2 更新代码

假设远程代码有变更,你想把本地代码更新时,可以在本地的版本库目录下通过 git pull 命令更新,不需要再指定远程地址,参考命令如下

git pull

如下结果所示

 ✝ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 686 字节 | 171.00 KiB/s, 完成.
来自 https://github.com/jundongpei/privateStartGit
   0502aa3..3a61c54  master     -> origin/master
更新 0502aa3..3a61c54
Fast-forward
 README.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

4.3 SSH 拉取

现在我们再来看看 SSH 方式,相比 HTTP(S) 来说更加安全,因为使用的是非对称加密,采用公钥与私钥的方式,不过相对来说配置起来会麻烦一些;好处是一次配置之后,后续不需要每次都进行认证,也更加安全。

4.3.1 尝试拉取代码

ssh 方式首次拉取代码的命令没有什么变化,相比来说只是远程地址有变化,如下命令所示

git clone [email protected]:jundongpei/privateStartGit.git sshtest

回车执行后,会提示需要权限验证,返回信息如下所示:

 ✝ git clone [email protected]:jundongpei/privateStartGit.git sshtest
正克隆到 'sshtest'...
ERROR: Repository not found.
fatal: 无法读取远程仓库。

请确认您有正确的访问权限并且仓库存在。

因为并没有配置公钥与私钥,所以拉取代码并没有成功。

4.3.2 创建一个 ssh key

通过 ssh 协议拉取代码首先要保证当前用户的主目录存在一个.ssh 的文件夹,并且里面已经存在私钥文件,如果没有的话我们可以通过 ssh-keygen,生成一份公钥与私钥,如下命令所示:

 ✝  ssh-keygen -t ed25519 -C "[email protected]"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/jundongpei/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/jundongpei/.ssh/id_ed25519.
Your public key has been saved in /Users/jundongpei/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:WHvI//d66nDuhIC/7IoPuT0zEnelRKibNXiuf+yPMYM [email protected]
The key's randomart image is:
+--[ED25519 256]--+
|         .       |
|        . .      |
|       o..       |
|      o+++. .    |
|      .*Sooo     |
|      +.o=o. .   |
|      o+Eo* o o  |
|      o=+.oB =. .|
|      o+=O*.o+*=.|
+----[SHA256]-----+

在执行命令的交互中,可以直接回车使用默认选项,最终会在当前用户目录下生成公钥于私钥,查看生成的公钥的命令为 cat ~/.ssh/iid_ed25519.pub, 在返回的信息中可以看到类似如下信息:

 ✝ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF0mGdTPRbtkmPlikRN6V8EIAbjpuyVdMNtxep/M43tS [email protected]

然后我们还需要将 SSH 密钥添加到 ssh-agent。

 ✝ ssh-add ~/.ssh/id_ed25519

上面的操作会在~/.ssh/config里追加一条记录。如果没有ssh-add 不好用,自己手动添加也是可以的。

Host github.com
	HostName github.com
	User jundongpei
	PreferredAuthentications publickey
	IdentityFile /Users/jundongpei/.ssh/id_ed25519
	UseKeychain yes
	AddKeysToAgent yes

4.3.3 添加公钥到服务器

当确认公钥于私钥生成完毕之后,我们还需要将公钥放到远程的 git 仓库中去,在github中,右上角有一个设置,在管理页面的左侧菜单中有一个ssh key的选项,我们将上面的公钥内容复制进去,如下图所示

git-4-10

添加完公钥之后我们就可以来测试一下。

 ✝ ssh -T [email protected]
Hi jundongpei! You've successfully authenticated, but GitHub does not provide shell access.

如果显示类似上面的消息,就说明我们添加成功了。

4.3.4 拉取代码

当公钥添加进去之后,就已经完成了权限配置,此时我们再次使用 ssh 方式拉取代码,就不会提示没有权限,执行结果如下所示

 ✝ git clone [email protected]:jundongpei/privateStartGit.git sshtest
正克隆到 'sshtest'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (5/5), done.
接收对象中: 100% (9/9), 完成.
remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0

可以看到在代码执行之后,代码已经拉取完成。

4.3.5 更新代码

ssh 方式更新代码命令和上面的 http 方式拉取代码命令一致,同样需要在 sshtest 目录下执行命令:git pull,然后可以看到 git 成功的拉取到了代码

 ✝ git pull
已经是最新的。

4.4 小结

在这一节中主要讲解了如何使用Gtihub创建一个远程仓库,以及两种协议拉取代码中的鉴权解决方法:

  1. Git 远程交互通常同时支持 HTTP(S)SSH 协议访问
  2. HTTP(S) 协议交互默认每次需要输入账号密码,但可以通过缓存认证方式处理
  3. SSH 协议需要将生成的公钥放到 Git 服务器当中去,配置之后 Git 会自动通过 ssh 协议进行鉴权,不需要通过账号加密码