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。
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.
如果链接不是指向一个资源文件,那么会得到一个网页
即:只是简单下载。
3,curl例子:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
4,补充:
(apt-get、wget、git clone、pip与pip3区别、apt-get和pip区别)