Skip to content
Published at:

Github下载慢问题探究

公司对网络进行了限制,还不能开代理,Github下载的那个项目又非常大,后来对这个问题进行了思索,随记录下来

git clone 经常是这样:17.00 KiB/s ???

shell
[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也提供了相应的选项:

bash
$ git help clone
		--depth <depth> # commit的个数,默认只clone一个分支 👍
		--single-branch # clone单个分支

测试:

clone全部:

shell
[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:

shell
[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:

shell
[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吗?

bash
[I] ➜ du -hs ./git_depth
 55M	../git_depth

git clone的时候其实是一系列的操作:先把远程的repo拉到本地仓库,然后把mater分支从本地仓库checkout出来,所以checkout出来的代码不会算做下载的大小.查看.git及目录的大小

bash
[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:向前推几十个
  • 看源码:全量下载

Updated at: