Github下载慢问题探究
公司对网络进行了限制,还不能开代理,Github下载的那个项目又非常大,后来对这个问题进行了思索,随记录下来
git clone 经常是这样:17.00 KiB/s ???
[I] ➜ git clone http://github.com/git/git git_
Cloning into 'git'...
warning: redirecting to https://github.com/git/git/
remote: Enumerating objects: 289445, done.
Receiving objects: 0% (2548/289445), 1.14 MiB | 17.00 KiB/s
抽象的归纳下,本质上是:下载一个资源慢的问题?
那下载时间的长短取决于:网速+资源大小
网速:
这里不考虑本地带宽,服务器资源带宽,p2p其它因素,这些因素影响没有那么大;
明显Github的服务器部署在国外,这时候有两个主要的办法
**代理:**这个就不多解释了 **把仓库搬到国内:**国内码云提供了相应的功能,一键将Github的repo迁移到国内,相关文章https://blog.gitee.com/2018/06/05/github_to_gitee/
资源大小:
如果是平时下载一个文件,下载一个小电影之类,这里就不用讨论了,但这里是下载的一个git仓库
通常去github下载一个仓库会不加思索的:git clone url.没错,我以前就是这么干的. 这样带来什么问题,默认这样clone下来的是远程仓库的完整复制版本,带从项目创建到当前最后的提交,包括所以有远程分支.Tags
不经想问:这都是你需要的吗? 对于大多数人的需求来说,答案都是否定的
Git commit-branch模型
看完这张图,可能会说,我只想到v1.0这个版本的代码,其它有要不要无所谓; 这图并不是突显出问题,说个数据git源代码的仓库现在快有6W个commit次提交.
其实git clone也提供了相应的选项:
$ git help clone
--depth <depth> # commit的个数,默认只clone一个分支 👍
--single-branch # clone单个分支
测试:
clone全部:
[I] ➜ git clone --branch master http://github.com/git/git
Cloning into 'git'...
warning: redirecting to https://github.com/git/git/
remote: Enumerating objects: 289445, done.
remote: Total 289445 (delta 0), reused 0 (delta 0), pack-reused 289445
Receiving objects: 100% (289445/289445), 139.10 MiB | 999.00 KiB/s, done.
Resolving deltas: 100% (215497/215497), done.
Updating files: 100% (3779/3779), done.
clone单个branch:
[I] ➜ git clone --single-branch http://github.com/git/git git_single_branch
Cloning into 'git_single_branch'...
warning: redirecting to https://github.com/git/git/
remote: Enumerating objects: 776, done.
remote: Counting objects: 100% (770/770), done.
remote: Compressing objects: 100% (770/770), done.
remote: Total 281961 (delta 0), reused 770 (delta 0), pack-reused 281191
Receiving objects: 100% (281961/281961), 134.84 MiB | 1.53 MiB/s, done.
Resolving deltas: 100% (210884/210884), done.
Updating files: 100% (3779/3779), done.
clone单个commit:
[I] ➜ git clone --depth 1 http://github.com/git/git git_depth
Cloning into 'git_depth'...
warning: redirecting to https://github.com/git/git/
remote: Enumerating objects: 3872, done.
remote: Counting objects: 100% (3872/3872), done.
remote: Compressing objects: 100% (3465/3465), done.
remote: Total 3872 (delta 325), reused 1877 (delta 250), pack-reused 0
Receiving objects: 100% (3872/3872), 9.13 MiB | 660.00 KiB/s, done.
Resolving deltas: 100% (325/325), done.
139.10 MiB --> 9.13 MiB下载的代码从139MB降低到了9MB, nice
项目为什么这么大?
这时候看下这个项目目录大小, 55M ??? 不是说好的9M吗?
[I] ➜ du -hs ./git_depth
55M ../git_depth
git clone的时候其实是一系列的操作:先把远程的repo拉到本地仓库,然后把mater分支从本地仓库checkout出来,所以checkout出来的代码不会算做下载的大小.查看.git及目录的大小
[I] ➜ du -hd1 .git
10M .git/objects
4.0K .git/info
12K .git/logs
52K .git/hooks
12K .git/refs
11M .git
看上去差不多了. 压缩:40M的代码 --> 9M仓库里面
实际的应用场景
- 只要最新的:depth 1
- 需要特定tag:向前推几十个
- 看源码:全量下载