GoodCoder666的个人博客

GitHub访问慢的原因以及解决办法

2022-07-16 · 10 min read
GitHub

注意:由于某些特殊原因,本文没有在CSDN上发布,因此这里是本文唯一可见的地址。

前言

相信大家工作时都难免会遇到。。。

GitHub 网页版无法访问
$ git push
Error: Failed to connect to github.com port 443: Timed out

$ git push
Error: OpenSSL SSL_read: Connection was reset, errno 10054

$ 滚
滚: command not found

$ sudo rm -rf /*

原因分析

先上ipaddress查一下GitHub的IP地址(有时会403),如图所示:
GitHub 第一次查询结果

过一会再查一下:
GitHub 第二次查询结果

!!!两次结果不一样!!!

后来发现,GitHub的服务器IP变化极其频繁,平均每半小时变一次,最快时3~5分钟就能变一次。我们知道,系统中有个叫DNS 解析缓存的东西,会存下来我们DNS的解析结果(也就是最近访问的网站的服务器IP),因此需要想办法重新获得正确的IP!!!

下面提供三种方法,可供参考,希望对大家有帮助。

解决方法

1. 刷新DNS解析缓存

注意:此方法仅适用于Windows系统。
可以配合后面的修改DNS方法,效果更佳。

1.1 手动刷新

GitHub访问不了的时候,按下Win+R,执行:

ipconfig /flushdns

这就是大名鼎鼎的「Windows DNS缓存刷新命令」。
若看到下列输出,则算成功:

Windows IP 配置

已成功刷新 DNS 解析缓存。

这时,重新打开GitHub或使用git远程操作,就大概率能成功了。
这样有些麻烦,因为每次都必须得执行命令解决问题,下面有“进阶版”——自动执行:

1.2 自动刷新

这种方法与上面的“手动刷新”原理相同,但无需每次手动输入命令,方便很多:
打开notepad,输入:

@echo off
:a
ipconfig /flushdns > NUL
echo [INFO %time:~0,8%] 已成功刷新 DNS 解析缓存。
echo 1分钟将再次刷新。按下任意键以立即刷新...
timeout /t 60 > NUL
echo.
goto a

Ctrl+Shift+S另存为,选择一个位置,保存为.bat后缀名的批处理文件(选择“所有文件”再自己输入后缀名),注意编码使用ANSI,否则会乱码!

下面直接双击刚才保存好的文件打开,会看到这样的输出:

[INFO HH:MM:SS] 已成功刷新 DNS 解析缓存。
1分钟将再次刷新。按下任意键以立即刷新...

这时,可将窗口最小化,程序会每分钟自动刷新一次,如果想提前刷新可以在里面按下任意键,会自动再刷新。

如果想更改刷新频率,可以在bat代码中修改:

@echo off
:a
ipconfig /flushdns > NUL
echo [INFO %time:~0,8%] 已成功刷新 DNS 解析缓存。
echo 1分钟将再次刷新。按下任意键以立即刷新...
timeout /t [freq (s), "60"=1min] > NUL
echo.
goto a

2. 使用GitHub520项目

GitHub520 项目地址:https://github.com/521xueweihan/GitHub520
官网:https://swh.app/(有时会打不开)
镜像地址(非官方,自己弄的):https://gitee.com/GoodCoder666/GitHub520

这个项目的工作原理是,通过程序自动从ipaddress实时获取GitHub服务器的IP,并修改对应HOSTS,达到代替默认DNS进行IP解析的作用。

参考文档:GitHub520 README
镜像地址:https://gitee.com/goodcoder666/GitHub520/blob/main/README.md

2.1 基础方法

打开https://raw.hellogithub.com/hosts,复制内容,添加到系统HOSTS文件的最后边。刷新一下DNS或重启电脑,启用新的IP解析。如果访问不了需要再次更新。

2.2 SwitchHosts

上述的方法明显太麻烦了,那有没有方法让电脑自动刷新呢?答案是肯定的。
使用「SwitchHosts」,就能实现自动刷新。

使用步骤:

  1. Release页面下载安装,并打开软件,应该能看到类似于下面的界面(不同操作系统下文件内容略有不同):
    SwitchHosts 主界面

  2. 点击左上角的“+”号,弹出如下界面:
    SwitchHosts 添加界面

  3. 选择“远程”,输入:
    标题:GitHub520(随意)
    URL:https://raw.hellogithub.com/hosts
    自动刷新:任意,尽量选择5分钟或15分钟
    SwitchHosts 添加示意图

  4. 点击“确定”,完成。

Tip

Tip:如果遇到这种情况,请提升 SwitchHosts 进程权限(Windows下的管理员身份运行等)

2.3 One-liner(适用于类Unix系统)

sed -i "/# GitHub520 Host Start/Q" /etc/hosts && curl https://raw.hellogithub.com/hosts >> /etc/hosts
自动更新/etc/hosts文件,可以添加到cron定时执行。使用前确保Github520内容在该文件最后部分。

2.4 AdGuard Home 用户

过滤器>DNS 封锁清单>添加阻止列表>添加一个自定义列表,配置如下:

  • 名称: 随意

  • URL: https://raw.hellogithub.com/hosts(和上面 SwitchHosts 使用的一样)

如图:

AdGuardHome-01

更新间隔在 设置>常规设置>过滤器更新间隔(设置一小时一次即可),记得勾选上 使用过滤器和 Hosts 文件以拦截指定域名

AdGuardHome-02

Tip:不要添加在 DNS 允许清单 内,只能添加在 DNS 封锁清单 才管用。另外,AdGuard for Mac、AdGuard for Windows、AdGuard for Android、AdGuard for IOS 等等 AdGuard 家族软件 添加方法均类似。

2.5 FasterHosts

FasterHosts 是个 Chrome 插件,主要原理是拦截浏览器的部分请求,将 domain 替换成访问速度较快的那个。HOSTS 资源来自 GitHub520,每 1 小时更新一次。

  1. 下载 FasterHosts 然后解压,找到 extension 子目录
  2. 打开 Chrome,输入: chrome://extensions/
  3. 打开「开发者模式」
  4. 选择「加载已解压的扩展程序」,然后定位到刚才解压的文件夹里面的 extension 目录,确定
  5. 安装好了,可关闭「开发者模式」

Tip: Chromium 内核的浏览器都可以使用,其他主流的 Chromium 浏览器还有Edge,Yandex等。

3. 使用Gitee镜像规避问题

Gitee相当于“中国版GitHub”,相对来说访问速度和稳定性都会好很多。
那么使用Gitee官方提供的镜像功能,可以暂时规避网络上的问题。

注意事项:
(1) 前三种方法只能解决无法访问的问题,但是下载速度太慢时也可以使用本法。
(2) 本方法仅针对代码仓库的访问问题,无法访问GitHub主页。

3.1 克隆非自己的存储库

我们以Pygame的GitHub仓库(https://github.com/pygame/pygame)为例:

  1. 打开存储库,复制Git地址(只能选HTTPS)。如果打不开也没事,直接在GitHub的repo地址后面加上.git就行了。
    复制Git地址

  2. 打开Gitee,选择从GitHub/GitLab导入仓库,填写信息:
    Gitee 导入仓库

  3. 点击“导入”,等待自动跳转:
    等待处理

加载完成

3.2 创建push/pull镜像

这种方法主要针对自己拥有/管理的代码库网络访问不稳定的情况。原理就是创建Personal Access Token(PAT)并交给Gitee,push镜像会将Gitee上的修改自动同步到GitHub上,而pull镜像则相反,会自动检测GitHub上的修改并同步至Gitee。

下面我们来分别介绍两种镜像的使用方式。

3.2.1 使用前:创建 GitHub 上的 Personal Access Token (PAT)
  1. 打开Personal Access Tokens,选择“Generate new token”,如图:
    创建PAT Token

  2. 输入密码,转到“New Token”界面,填写信息,其中Note随意填写,Expiration为期限,建议选择60天,后面的权限建议勾选repo、workflow(仅push镜像)、repo_hook(仅pull镜像)。Token 生成

  3. 点击下面的“Generate token”,生成令牌,点击复制:
    new token

  4. 完成!请看下面的“镜像配置”部分。

3.2.2 Push镜像配置

Gitee提供的镜像既可以用私有GitHub存储库,也可以配置公开的。为了方便演示,我们以私有的为例。

现在我在GitHub上创建了一个仓库GoodCoder666/test-mirror(私有),如下:
test-mirror代码库

然后使用3.1中的的方法导入,效果如下:
test-mirror镜像

仓库就绪,下面创建镜像。

  1. 选择管理\to仓库镜像管理\to添加镜像,如图(需绑定对应GitHub账号):
    添加镜像

  2. 选择镜像方向Push和GitHub仓库,再输入刚刚生成好的Token,如图:
    镜像信息选择

  3. 点击“添加”,效果图:
    镜像效果

此时,在Gitee上作出更改,会自动实时同步到GitHub上(可能有1~2分钟的延迟)
比如现在修改了Gitee这边:
Gitee 修改

然后看GitHub:
GitHub 同步

注意这里的gitee-org,只有在Gitee网页版更改时会出现(我也不知道为啥),git push时则正常。

3.3.3 Pull镜像配置

与Push镜像相似,不同之处为Push是Gitee->GitHub,而Pull实为GitHub->Gitee的镜像。镜像配置请参考3.3.2 Push镜像配置,注意Token需勾选admin:repo_hook

4. 更换DNS解析服务器

根据自己的网络情况,选择下表中的一种推荐的首选/备选DNS服务器地址,按照这里的方法修改DNS(此方法适用于Windows,其他操作系统请自行百度)

DNS组合 首选DNS 备选DNS 备注
CNNIC+114 1.2.4.8 114.114.114.114 强烈推荐/成功率最高/响应最快
Google+114 8.8.8.8 114.114.114.114 成功率较高/响应较快/主流搭配
纯114DNS 114.114.114.114 114.114.115.115 成功率较高/响应很快
114+Cloudflare 114.114.114.114 1.1.1.1 成功率较高/1.1.1.1响应稍慢

总结

GitHub访问慢的主要原因是由于DNS的问题导致的(也有部分CDN问题没有提及),刚才的三种方法分别是:

  • DNS刷新
  • GitHub520
  • Gitee镜像
  • 更换DNS解析服务器

需要注意的是,没有方法能保证100%100\%成功(Gitee镜像除外,但功能有限),然而成功率最高的是修改DNS,基本上可以说是一劳永逸

希望以上内容能对大家有帮助!