GitHub520:在 hosts 里写 40 行映射,解决 GitHub 图裂和加载慢
【免费下载链接】GitHub520:kissing_heart: 让你“爱”上 GitHub,解决访问时图裂、加载慢的问题。(无需安装)项目地址: https://gitcode.com/GitHub_Trending/gi/GitHub520
GitHub520 解决的就是 GitHub 图裂、加载慢的问题:打开项目页面时 README 里的 logo 变成小碎图标、头像全灰、clone 仓库转几分钟超时。它的做法是把 40 条“域名 → 最快 IP”的映射写进你电脑的 hosts 文件(一个系统自带的、手动指定域名指向哪个 IP 的文件),全程不安装任何软件。读完本文,你 5 分钟就能配置生效,还能说清楚它背后干了什么。
它是如何干活的:先收候选 IP,再挑最快 🏃
从两个渠道拿候选 IP
同一个域名,DNS 返回的 IP 不固定,而且不同 IP 从国内访问的速度差很多。所以 GitHub520 不直接用 DNS 返回的第一个 IP,而是从两个渠道查:
- DoH(DNS over HTTPS,走 HTTPS 的加密 DNS 查询):按顺序问阿里 DNS、DNSPod、Google,谁先成功用谁
- 普通 DNS 查询:问 114DNS、阿里、腾讯 DNS,外加 Cloudflare、Google 兜底
两个渠道的结果合并去重,再剔除1.0.1.1、127.0.0.1这类无效值。40 个 GitHub 相关域名(定义在 common.py 的列表里,覆盖 github.com、头像、静态资源等)就这样逐个得到候选 IP:
用三次 TCP 连接测速,取中位数
测速的关键技巧:它不发真正的 ICMP ping(那需要管理员权限,还容易被网络屏蔽),而是直接向 IP 的 443 端口(HTTPS 用的端口)建 3 次 TCP 连接,看各花几毫秒——这比 ping 更接近“打开 GitHub 页面”的真实体感。fetch_ips.py 里的挑选逻辑就 3 行:
ping_results = [(ip, ping_cached(ip)) for ip in ip_list] ping_results.sort(key=lambda x: x[1]) return ping_results[0][0]每个 IP 的中位数延迟只测一次(同 IP 结果会缓存,不重复测),排序后返回最快的那个。最终每个域名配出一行IP + 域名,40 行拼成仓库里现成的 hosts 文件。
五分钟上手 🛠️
你不需要碰任何源码。测速已经在服务端替你做完了,你只需要把结果放进本地 hosts 文件。三种方式任选,推荐 A 或 B。
方式 A:手动粘进 hosts 文件
第一步,复制内容。浏览器打开https://raw.hellogithub.com/hosts(不用访问 GitHub),全选复制;也可以直接复制 README.md 里 bash 代码块中的 hosts 内容。
第二步,粘贴到 hosts 文件末尾:
| 系统 | hosts 文件位置 | 修改方式 |
|---|---|---|
| Windows | C:\Windows\System32\drivers\etc\hosts | 记事本打开,粘贴到末尾后保存(需管理员权限) |
| macOS | /etc/hosts | sudo vi /etc/hosts |
| Linux | /etc/hosts | sudo vi /etc/hosts |
| Android | /system/etc/hosts | 需要 root |
| iPhone | /etc/hosts | 需要越狱 |
第三步,刷新 DNS 缓存让它生效:Windows 在 CMD 输入ipconfig /flushdns;macOS 执行sudo killall -HUP mDNSResponder;Linux 执行sudo nscd restart(报错了就先sudo apt install nscd)。多数情况立即生效,实在不行重启一次电脑。
这里有个小技巧——不想手动复制的话,GNU/Linux 和 macOS 各有一条命令搞定(命令会先删掉旧的 GitHub520 段落再追加新的,可以重复执行):
# GNU/Linux(Ubuntu/CentOS/Fedora) sudo sh -c 'sed -i "/# GitHub520 Host Start/Q" /etc/hosts && curl https://raw.hellogithub.com/hosts >> /etc/hosts' # BSD/macOS sudo sed -i "" "/# GitHub520 Host Start/,/# Github520 Host End/d" /etc/hosts && curl https://raw.hellogithub.com/hosts | sudo tee -a /etc/hosts'执行后 hosts 文件末尾就是最新的 40 行映射,之后可加进定时任务每天自动跑一遍。
方式 B:用 SwitchHosts 自动刷新(推荐)
SwitchHosts 是一个管理 hosts 文件的小工具,图形界面、跨平台。新建一个 host 组,按下面填:类型选Remote,URL 填https://raw.hellogithub.com/hosts,自动刷新选1 小时。
配好后 hosts 有更新会自动拉取,你彻底不用管更新这件事。
方式 C:AdGuard 用户直接加规则
如果你在用 AdGuard(设备级的广告拦截和过滤工具),走过滤器 > DNS 封锁清单添加自定义列表,名称随意,URL 同样填https://raw.hellogithub.com/hosts:
再去设置 > 常规设置,勾选“使用过滤器和 Hosts 文件以拦截指定域名”,过滤器更新间隔选 1 小时即可。注意这条规则只能加在“封锁清单”里,加进允许清单是不生效的。
验收:图回来了吗
刷新一个以前图裂的 GitHub 项目页,效果和下面两张截图的差异一致——上图图片位置是碎图标、星星数徽标缺失;下图全部正常加载:
再深一层 🔍
为什么取中位数而不是平均值
假设某个 IP 测出 12ms、450ms、470ms 三次延迟,平均下来 310ms 反而失真——一次偶发的抖动就能把整体带偏。取中位数 450ms 才是你真实的体感。fetch_ips.py 里对应这段(端口和超时写了实际值,原代码用常量名):
for _ in range(3): try: with socket.create_connection((ip, 443), timeout=1): latencies.append((time.time() - start) * 1000) except Exception: latencies.append(1000) latencies.sort()注意except那两行:连不上的 IP 直接按 1 秒超时记录。也就是说“连不通的 IP”会在排序里天然垫底被刷掉,不用额外写错误处理。
IP 没变,就不重写文件
项目定期跑 fetch_ips.py 测速、更新 hosts.json;update_ips.py 负责把结果同步回仓库里的文件。但它不无脑写,common.py 里先做对比:
if old_hosts == hosts_content_hosts: print("host not change") return False拿 README 里的旧 hosts 和新测出的 hosts 逐行比,真变了才重写 README、hosts 和 hosts.json 三个文件。所以大部分时间仓库里的更新时间是不动的——因为 IP 压根没变。
这套流程由 CI(持续集成,指平台按定时任务自动跑代码的机制)驱动:服务端定期测速出结果,你这边只管拉最新文件,两边完全解耦。
收束与延伸
GitHub520 的核心思路其实很朴素:把“找最快 IP”这件脏活累活交给服务端每天做,用户侧只粘一个文件,零安装;配上“测速取中位数防抖动”“内容没变就不重写文件”这两个细节,让它能长期稳定地用。
如果你还想自己测速、换一套本地视角的 IP,可以git clone https://gitcode.com/GitHub_Trending/gi/GitHub520,按requirements.txt装好依赖(Windows 上额外装pycares),跑一次python fetch_ips.py就会在本地生成一份新的 hosts。用着有问题,直接去项目的 issue 区提,作者都在那儿。
【免费下载链接】GitHub520:kissing_heart: 让你“爱”上 GitHub,解决访问时图裂、加载慢的问题。(无需安装)项目地址: https://gitcode.com/GitHub_Trending/gi/GitHub520
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考