git学习4-远程仓库
最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。其实一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。不过,现实生活中是不会有人这么傻的在一台电脑上搞几个远程库玩,因为一台电脑上搞几个远程库完全没有意义,而且硬盘挂了会导致所有库都挂掉。
实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有GitHub、ATLASSIAN Bitbucket...,从名字就可以看出,就是提供Git仓库托管服务的,所以,只要注册一个GitHub、Bitbucket账号,就可以免费获得Git远程仓库。个人体会国内Bitbucket更快;Github目前不支持中文(中文文档)。
自行在线注册git账号不在话下。
很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地。然而,为什么绝大多数人会使用https url克隆呢?
这是因为,使用https url克隆对初学者来说会比较方便,复制https url 然后到 git Bash 里面直接用clone命令克隆到本地就好了。而使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH key 。而且如果你想要使用 SSH url 克隆的话,你必须是这个项目的拥有者。否则你是无法添加 SSH key 的。
https 和 SSH 的区别:
1、前者可以随意克隆github上的项目,而不管是谁的;而后者则是你必须是你要克隆的项目的拥有者或管理员,且需要先添加 SSH key ,否则无法克隆。
2、https url 在push的时候是需要验证用户名和密码的;而 SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码,否则是不需要输入密码。
SSH加密
第1步 本地终端生成密钥(私钥、公钥)
创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key。ssh-keygen -t rsa -C 'caryss@aliyun.com'
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对。
-
id_rsa
是私钥,不能泄露出去。 -
id_rsa.pub
是公钥,可以放心地告诉任何人。 -
友情提示:例子中的涉密信息都处理过了。
据说命令
$ ssh-keygen
# 无需参数也可以,这里不研究了。代码参数含义:
-t 指定密钥类型,默认是 rsa,可以省略。
-C 设置注释文字,比如邮箱。生成的公钥里有带有这个邮箱,但不影响将其同时提供给GitHub、Bitbucket。
-f 指定密钥文件存储文件名。
$ cd
~$ ls -a
. .bash_history .bashrc .gitbook .motd_shown .profile .sudo_as_admin_successful .viminfo
.. .bash_logout .config .landscape .npm .python_history .vim
~$ ssh-keygen -t rsa -C 'caryss@aliyun.com'
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cary/.ssh/id_rsa):
Created directory '/home/cary/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/cary/.ssh/id_rsa
Your public key has been saved in /home/cary/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:IcOuJIb971hzBDy24G5BcnvbnqYz5P0sc9TrGKFDBig carys@aliyun.com
The key's randomart image is:
+---[RSA 3072]----+
| |
| + |
| E = X . |
| o * = B . |
|. + = + S .. |
| . = +.* .... |
| =o+.=.. . |
| . +++=+.o. |
| ..+=o=+.. |
+----[SHA256]-----+
~$ ls .ssh
id_rsa id_rsa.pub
~$ cat .ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
~$ cat .ssh/id_rsa.pub
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABgQCtWPv0wrSNB6EZ34KliW6Xx1JAJ4n1PV2VG/mawsrP2I0NftkGx3osVeaPUva4TdnjshdsCYK0K4NS
h3nJC2fgBSZNiTFAkuQHl85ciU534N6xp+JQHhRlThDazWJOrKrd86G6//hTenYrYIHHUezZqBx3fa1XgkfX28UfYczdt+3oWsmoGAW2NCNW
iuev+NX4qBm+dxSLuAbOyYBdMOvHgnvWXadJAp5bMaBEPRLBnbZlZ/8GMTz4xA7V54CqJ8L2ODv5e2T8qhVaH3C4q+napN+HXhqmqAZ8fChK
iTclO5Z/4At889GEF+OyYvanN0Tql55lVTK9zcplJC/8p7aBRI2zEsnvF8jYVEFFZYKVojvN5olUAzskGVbh1dvDdK+vdVCTMIvXj2apUA1h
U= caryss@aliyun.com
~$
passphrase n. 密码
randomart n. 随机艺术
第2步 远程Git服务上添加公钥
-
登录Bitbucket home page -> Your profile and settings -> Personal settings -> SSH密钥 -> 【添加密钥】,填上任意Label,在Key文本框里粘贴
id_rsa.pub
文件的内容。(邮箱内容会被平台自动过滤掉)。 -
登录Github home page -> Account settings -> SSH and GPG keys -> 【New SSH keys】,填上任意Title,在Key文本框里粘贴
id_rsa.pub
文件的内容。
廖老师:
登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容。
为什么Bitbucket需要SSH Key呢?因为Bitbucket需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,Bitbucket只要知道了你的公钥,就可以确认只有你自己才能推送。
-
当然,Bitbucket允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到Bitbucket,就可以在每台电脑上往Bitbucket推送了。
-
一个电脑系统的公钥也可以同时提供给不同的Git服务平台,这是允许的。
-
友情提示:在GitHub / Bitbucket上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
-
Bitbucket、GitHub上都可以设置 private repository。
廖老师:
如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让Bitbucket把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。
另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。这个方法我们后面会讲到的,相当简单,公司内部开发必备。
SSH Key访问测试
SSH警告
当你第一次使用Git的clone
或者push
命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is SHA256:nThbg6viKw6E1IGxdCARLviKw6RLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes
回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes
前可以对照GitHub的RSA Key的指纹信息 (中文-GitHub 的 SSH 密钥指纹 - GitHub Docs)是否与SSH连接给出的一致。
这样可以认为github端给出了他的fingerprint,表明github身份真实。
初次登录Are you sure you want to continue connecting (yes/no/[fingerprint])?
直接回车即可。
实操 Github:
~$ ssh git@github.com
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi caryqd! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
~$ ssh git@github.com
PTY allocation request failed on channel 0
Hi caryqd! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
~$ ssh -T git@github.com
Hi caryqd! You've successfully authenticated, but GitHub does not provide shell access.
~$
实操 Bitbucket:
~$ ssh git@bitbucket.org
Connection closed by 104.192.141.1 port 22
~$ git --version
git version 2.25.1
~$ ssh git@bitbucket.org
The authenticity of host 'bitbucket.org (104.192.141.1)' can't be established.
RSA key fingerprint is SHA256:zzXQOXSRBEiUtuE8AikJYKwbHaxvSc0ojez9YXaGp1A.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'bitbucket.org,104.192.141.1' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
logged in as carysunqd
You can use git to connect to Bitbucket. Shell access is disabled
Connection to bitbucket.org closed.
~$ ssh -T git@bitbucket.org
logged in as carysunqd
You can use git to connect to Bitbucket. Shell access is disabled
~$
ssh -T Disable pseudo-terminal allocation
禁用伪终端分配