git clone/wget/curl 特点和区别(基于协议差异)

git相关的一个问答:

使用git clone时,如果后面跟的是http协议的url,那么服务器端会作何处理,才会返回版本库?
例如url:https://github.com/pallets/flask 既可以使用浏览器访问,也可以使用git客户端工具进行克隆,不过克隆出来的是一个目录,据我所知,目前网页不能直接返回一个目录,只能返回一个文件。
那么问题来了:
1,git客户端访问该url时,网站是否返回了一个包含该目录的所有文件列表,从而使git客户端去遍历下载这些文件。
2,如果1成立,那么服务器端应该如何判定访问的是git客户端,而不是浏览器。
3,如果1成立,那么服务器端返回的文件列表是什么格式的?
4,从哪里可以了解到这些技术规范?

一般是三种情况。
情况一:实现了 Smart HTTP Protocol 的 git 客户端此时 git 客户端会尝试判断服务端是否支持 Smart HTTP Protocol,
如果支持就用 git 自己的协议传输,
否则就从服务器上一个个文件分别下载下来(即退回到情况二所述的 Dumb HTTP Protocol)。

情况二:未实现 Smart HTTP Protocol 的 git 客户端这种貌似现在比较少见,
此时 git 客户端会自己一个一个把文件下载下来。
拉取时(貌似)只会拉取 repo 地址下 info/refs 获取远端 object 列表,然后通过类似 objects/d0/49f6c27a2244e12041955e262a404c7faba355 的路径下载单独的 object,
不会直接访问到 repo 地址。

情况三:客户端是网页浏览器这种情况下一般会有比较明显的 User-Agent 标记这是个浏览器,
而且浏览器会访问的地址一般也会避开 Dumb HTTP Protocol 会用到的地址。
不过也有些情况下服务器端会简化设计,
直接要求浏览器和 git 使用不同的 repo url(之前用过 SCM Manager 搭服务端,貌似就是这么设计的,不过没实际证实)。
详细的内容可以参阅 git 源码里的 Documentation/technical/http-protocol.txt,
以及同一个目录的 pack-protocol.txt 和 protocol-capabilities.txt。
View Code

Git 内部原理 - 传输协议

1,git获取repo

下载repo
git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo

将git-repo中的repo文件复制到 1 创建的.bin目录中
cd git-repo 
cp repo ~/.bin/


2,wget并不能替换git clone:比如获取 repo:

如果采用wget https://xxxxxx                 获取repo 失败!得到是网页


 wget https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
--2021-04-05 13:53:35--  https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
Resolving gerrit-googlesource.lug.ustc.edu.cn (gerrit-googlesource.lug.ustc.edu.cn)... 192.109.232.118, 2400:ddc0:1000::6417:bae0
Connecting to gerrit-googlesource.lug.ustc.edu.cn (gerrit-googlesource.lug.ustc.edu.cn)|192.109.232.118|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://gerrit-googlesource.proxy.ustclug.org/git-repo [following]
--2021-04-05 13:53:36--  https://gerrit-googlesource.proxy.ustclug.org/git-repo
Resolving gerrit-googlesource.proxy.ustclug.org (gerrit-googlesource.proxy.ustclug.org)... 192.109.232.118, 2400:ddc0:1000::6417:bae0
Connecting to gerrit-googlesource.proxy.ustclug.org (gerrit-googlesource.proxy.ustclug.org)|192.109.232.118|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘git-repo.1’

    [ <=>                                   ] 10,228      --.-K/s   in 0s

2021-04-05 13:53:36 (157 MB/s) - ‘git-repo.1’ saved [10228]


wget https://gerrit-googlesource.lug.ustc.edu.cn/git-repo/repo

--2021-04-05 13:22:07--  https://gerrit-googlesource.lug.ustc.edu.cn/git-repo/repo
Resolving gerrit-googlesource.lug.ustc.edu.cn (gerrit-googlesource.lug.ustc.edu.cn)... 192.109.232.118, 2400:ddc0:1000::6417:bae0
Connecting to gerrit-googlesource.lug.ustc.edu.cn (gerrit-googlesource.lug.ustc.edu.cn)|192.109.232.118|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://gerrit-googlesource.proxy.ustclug.org/git-repo/repo [following]
--2021-04-05 13:22:07--  https://gerrit-googlesource.proxy.ustclug.org/git-repo/repo
Resolving gerrit-googlesource.proxy.ustclug.org (gerrit-googlesource.proxy.ustclug.org)... 192.109.232.118, 2400:ddc0:1000::6417:bae0
Connecting to gerrit-googlesource.proxy.ustclug.org (gerrit-googlesource.proxy.ustclug.org)|192.109.232.118|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2021-04-05 13:22:08 ERROR 404: Not Found.
View Code

如果链接不是指向一个资源文件,那么会得到一个网页

即:只是简单下载。

3,curl例子:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo

4,补充:

curl和wget的区别和使用

curl http请求,wget和curl

curl和wget使用区别

(apt-get、wget、git clone、pip与pip3区别、apt-get和pip区别)

 

posted @ 2021-04-05 14:02  假程序猿  阅读(2403)  评论(0编辑  收藏  举报