V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
bryan31
V2EX  ›  Java

访问 github 太慢?我写了一个开源小工具一键变快

  •  2
     
  •   bryan31 · Aug 24, 2020 · 7567 views
    This topic created in 2082 days ago, the information mentioned may be changed or developed.

    前言

    GitHub 应该是广大开发者最常去的站点,这里面有大量的优秀项目,是广大开发者寻找资源,交友学习的好地方。尤其是前段时间 GitHub 公布了一项代码存档计划——Arctic Code Vault,要把代码埋入地下 250 米深的永久冻土层,可以将代码保存一千年。此外,GitHub 还为开发者在配置文件中设计了纪念徽章。

    想想自己的代码可以作为人类的技术瑰宝被保存一千年,是不是有点自豪呢。

    好了,言归正传。

    虽然 GitHub 没有被 Q,但是由于 CDN 服务器都在国外,所以国内访问 GitHub 的速度实在是慢的一匹,有时候经常页面刷不出,在我获取知识的道路上增加了重重的阻碍。

    所以,我肝了 3 小时,写了一个在不用 T 子的情况下,加速 GitHub 访问速度的小工具,最后会分享给大家。

    同时,这篇文章也会分享其他加速 GitHub 访问的方法。算是一个比较全的整理吧。

    Let's get it!

    自动生成最快访问 host 的小工具

    GitHub 在国内访问速度慢的原因其实有很多,但最主要的原因就是 GitHub 的分发加速网络域名遭到 DNS 的污染。为了解决这个问题,网上有很多文章提供了一个解决方案,就是通过修改 Hosts 文件,绕过国内的 DNS 解析,直接访问 GitHub 的 CDN 节点,从而达到加速的目的。

    但是我看大多数关于此方法的介绍,只提供 3 个 github 的相关域名,而且需要在ipaddress.com 一个个去查,根据查到的 ip,再去自己 ping,肉眼选取最快的 ip,自行编辑成 IP+域名格式,贴到 hosts 文件里。

    其实 GitHub 用到相关域名有很多,我整理了下,一共有十几个

    github.global.ssl.fastly.net
    github.com
    assets-cdn.github.com
    documentcloud.github.com
    gist.github.com
    help.github.com
    nodeload.github.com
    codeload.github.com
    raw.github.com
    status.github.com
    training.github.com
    avatars0.githubusercontent.com
    avatars1.githubusercontent.com
    avatars2.githubusercontent.com
    avatars3.githubusercontent.com
    

    这要是一个个去查,一个个去选取,也是挺麻烦的。

    为此我写了一个工具,能自动的根据你当前 ip,去寻找这十几个域名所对应最快的 CDN 节点,如果一个 ip 对应多个 CDN 节点,工具会自动帮你去 ping 10 次,取到平均值最小的 CDN 的 IP 地址。

    你需要做的,只是把最终生成的结果贴到你的 hosts 文件中即可。

    这个小工具,关注「元人部落」输入 github 即可获取到。

    用法很简单,只需要执行以下命令即可运行

    java -jar githubhost.jar
    

    运行起来后,浏览器输入127.0.0.1:8880即可自动进行根据你当前 Ip 进行分析:

    file

    分析大概需要十几秒,进度条会自动刷新,等进度条满了之后,即可看到生成内容:

    file

    每个地区每个运营商可能运行出来的都不一样,所以得出结果后,你就可以把这段内容追加到你 hosts 文件中(如果不知道 hosts 存放位置,可以自行 baidu),然后根据提示让 hosts 文件生效。

    指定了 CDN 的访问地址,可以让你的 github 访问至少无卡顿了。

    码云 GitHub 镜像站

    码云提供了一个”码云急速下载“站,每天从 github 上同步一些项目。

    https://gitee.com/mirrors

    个人感觉应该不是所有的 github 项目都会同步过来,看仓库数量,有大概 15k 的项目

    file

    如果你想 clone 一些项目去研究,可以先在这里找找有没有。码云因为是国内开源项目站点,git clone 速度自然不用担心,但是很可惜的是

    1.这个镜像站点不是所有的 github 项目,不过大多数热门项目都会有

    2.issue 和 release 包也没有,只有代码

    3.有一天的延迟。即你看到的是一天前的项目状态

    4.因为不是 github,所以你也没法通过这个 push 到 github 上的项目

    GitHub 镜像站

    这个镜像站为:

    https://github.com.cnpmjs.org/

    进入之后,完全和 github 没有任何区别,访问也很快。

    尤其是 clone 代码,那是飞快啊。。。

    比如,你原先要 clone,这样写

    git clone https://github.com/kubernetes/kubernetes.git
    

    现在改成:

    git clone https://github.com.cnpmjs.org/kubernetes/kubernetes.git
    

    试一下:

    file

    这个速度,应该无欲无求了吧。。。

    不过这个方法可惜的是:

    1.这个镜像站很不稳定,你时常会看到:

    file

    2.你每次 clone 还需要自己去修改 url,有点不方便

    3.你依旧没法 push

    GitClone 站点

    在寻找解决之道的途中,我又发现一个站点:gitclone

    https://gitclone.com/

    file

    这是一个 GitHub 的缓存加速节点,也大约缓存了 15k 个项目,但是 gitclone 单独做了一个站点,里面可以进行搜索项目,甚至于还可以创建仓库。

    gitclone 的 clone 提供了多种方式来 clone

    file

    但是搜索到的项目,最终查看还是跳转到 GitHub 相应的页面。

    所以其实和 gitee 镜像站都差不多。换汤不换药,问题和之前几个镜像站点差不多,不过你只是要 clone,还是不错的选择。

    总结

    其实在不用 T 子的情况下,方式无非就两种:

    1. 修改 hosts,直接访问最快的 CDN 节点,这种方式优势在于原汁原味。
    2. 通过镜像去访问和 clone,这种方式优势在于 clone 的速度。

    个人推荐如果主要浏览为主,还是用上文推荐的工具去生成 hosts 进行配置,毕竟原汁原味,clone 大项目的话,可以考虑以上镜像站点去加速下载。

    关注作者

    最后把这个开源工具分享给大家,关注「元人部落」公众号,并回复 github 即可获取到这个工具 jar 包。启动后访问 127.0.0.1:8880 端口即可自动生成。

    一个坚持做原创的技术科技分享号,希望你能关注我,我每周会出一篇实用的原创技术文章,陪着你一起走,不再害怕。

    img

    41 replies    2020-09-08 14:30:43 +08:00
    imdreamer
        1
    imdreamer  
       Aug 24, 2020   ❤️ 4
    好文章
    不过我 proxy_on 代理一开,速度拉满
    ddzy
        2
    ddzy  
       Aug 24, 2020
    1
    mh
        3
    mh  
       Aug 24, 2020   ❤️ 12
    需要关注公众号、要有 java 环境,还需要运行这个 jar 包,一套操作下来还不如开个代理省事
    GrayXu
        4
    GrayXu  
       Aug 24, 2020
    问题是,代理的成本非常低,没必要这样绕一圈
    shm7
        5
    shm7  
       Aug 24, 2020
    卧槽,git proxy 不行吗?搞这么复杂干啥?
    madpecker009
        6
    madpecker009  
       Aug 24, 2020
    好东西 star
    d5
        7
    d5  
       Aug 24, 2020 via iPhone
    很棒,可以提供 go 版本吗?或者网页在线版本。java 的环境一大堆不太轻量。
    bryan31
        8
    bryan31  
    OP
       Aug 24, 2020
    @d5 我不会 go,但是我可以给你一个不装 java 也可以执行的版本。可以通过公众号加我私人微信,我可以提供给你
    byzf
        9
    byzf  
       Aug 24, 2020   ❤️ 1
    dns 代理目前还是免费的.

    思路还可以,吸粉的同时还筛了粉
    leaderhyh
        10
    leaderhyh  
       Aug 24, 2020
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at com.yomahub.githubhost.controller.HostsController.getBestCdnIpForHost(HostsController.java:119)
    bryan31
        11
    bryan31  
    OP
       Aug 24, 2020
    @leaderhyh 刚刚也有人反馈了,已经解决了,重新拉下工具 jar 包,就可以了
    Redbeanw
        12
    Redbeanw  
       Aug 24, 2020
    看你这一波操作...

    路由器代理 /tapDriver 了解一下,
    chendy
        13
    chendy  
       Aug 24, 2020
    这一顿操作何必呢,核心逻辑估计就一个 java 文件…
    ochatokori
        14
    ochatokori  
       Aug 24, 2020 via Android   ❤️ 1
    都用 java 了,不送佛送到西帮忙写进 host 吗😂
    justin2018
        15
    justin2018  
       Aug 24, 2020
    今日头条是不是有一篇 我早上上班的时候 瞅到了 😁
    bryan31
        16
    bryan31  
    OP
       Aug 24, 2020
    @ochatokori 哥,我能写到 hosts 里,我就可以删你 hosts 和删你系统文件,这不就变病毒了嘛。系统都会保护这些重要文件的,不让修改的。
    bryan31
        17
    bryan31  
    OP
       Aug 24, 2020
    @justin2018 我没在今日头条发过,估计是转载吧,我去瞅瞅
    bryan31
        18
    bryan31  
    OP
       Aug 24, 2020
    @GrayXu 纯属做着玩玩,分享下,有些人可能找不到好的代理。我自己有时也挂梯子。
    JaminT
        20
    JaminT  
       Aug 24, 2020
    总感觉把问题复杂化了啊
    JaminT
        21
    JaminT  
       Aug 24, 2020
    不知道这个原理是什么样的,如果我做成服务端别人访问的话,是否可行呢。这样的话就有一定的价值了
    g00001
        22
    g00001  
       Aug 24, 2020
    github 官方有提供 API 获取 IP 列表,
    win2ray 有个 github 加速工具,一键改 hosts 提速。


    提速效果明显。
    g00001
        23
    g00001  
       Aug 24, 2020
    knightdf
        24
    knightdf  
       Aug 24, 2020
    莫名反感码云
    bryan31
        25
    bryan31  
    OP
       Aug 24, 2020
    @justin2018 嗯,我看到了,他是转载我公众号“元人部落”里的文章的
    bryan31
        26
    bryan31  
    OP
       Aug 24, 2020
    @cuixiao603 实现原理就是去请求 ipaddress.com 这个站点,根据请求的 ip 来获得最快的 cdn 节点。所以一定要本地运行 ,如果做成在线版,那拿到的 ip 就是在线版服务器所在的 ip,那每个人获取到的都是一样的了。这个页面也不支持传入相应的 ip,所以没法通过透传 ip 来解决。所以只能本地运行,获取的结果才是最准确的
    okampfer
        28
    okampfer  
       Aug 24, 2020
    既然是开源工具,能否提供下源码?我想把它移植到我熟悉的语言上面。
    suzic
        29
    suzic  
       Aug 24, 2020 via Android
    有源码吗?
    suzic
        30
    suzic  
       Aug 24, 2020 via Android
    源码在公众号提供了链接
    0x4F5DA2
        31
    0x4F5DA2  
       Aug 24, 2020
    教育网无所畏惧(
    laycher
        32
    laycher  
       Aug 24, 2020
    能不能做成网站,我直接打开网址后生成 hosts 的内容。
    Trim21
        33
    Trim21  
       Aug 24, 2020
    “此外,GitHub 还为开发者在配置文件中设计了纪念徽章。”怎么有一种机翻的感觉...
    masker
        34
    masker  
       Aug 24, 2020 via Android
    用个代理应该不难吧?怎么 2020 年还有人大费周章去折腾这些?真就怕自己的数据被人监听啦?不是吧
    baiduyixia
        35
    baiduyixia  
       Aug 24, 2020
    您是想访问 github.com 吧?
    您刚才尝试访问的网站貌似为虚假网站。攻击者有时会对网址做些令人难以发现的细微更改来仿冒网站。
    bryan31
        36
    bryan31  
    OP
       Aug 24, 2020
    @laycher 请参照 26 楼我的回复
    SingeeKing
        37
    SingeeKing  
    PRO
       Aug 25, 2020 via iPhone
    raw.githubcontent.com 竟然没包括
    farmer01
        38
    farmer01  
       Aug 25, 2020   ❤️ 1
    一个小建议,最好用 TCPING 而不是 ICMP 的 Ping 。
    因为实际网络应用中,运营商可能会对 ICMP 进行优化从而得不到准确的网络连接质量的信息。
    而 TCPING 就是模拟实际 TCP 第一次握手过程,计算延迟,这样算出来的延迟在公网上比 ICMP 的 Ping 更加准确。
    xiaoyu18369
        39
    xiaoyu18369  
       Aug 25, 2020
    打个 tag
    bryan31
        40
    bryan31  
    OP
       Aug 26, 2020
    @farmer01 受教了
    127000
        41
    127000  
       Sep 8, 2020
    补充个镜像服务,支持 github release 下载
    doc.fastgit.org/en-us/node.html
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3260 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 108ms · UTC 14:02 · PVG 22:02 · LAX 07:02 · JFK 10:02
    ♥ Do have faith in what you're doing.