[2022-03] GitHub 加速终极教程

2022-03-28 14:45:43 +08:00
 AllenHua

时常看到 V 站吐嘈 git clone 慢的帖子,本人写了这篇文章,推荐 阅读原文


本文意图解决使用 GitHub 访问( https) 或者 git clone ( https or ssh )慢的问题。在此分享我的方法,我所了解的 GitHub 加速最佳方案。

前提是,你的木弟子应该还行,木弟子越好,GitHub 体验越好

很多文章没有讲全面,只讲了 http proxy ,而没有讲 ssh proxy 。事实上大部分程序员使用 GitHub 都会使用 SSH keys (普通用户可能就不会了),在本机生成 rsa 公私钥(其他的类型还有 dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk),然后把公钥内容拷贝、设置进 GitHub 。

设置 Http Proxy

$ git config --global http.proxy socks5://127.0.0.1:7890

事实上使用 socks5h 更佳,即

$ git config --global http.proxy socks5h://127.0.0.1:7890

h 代表 host ,包括了域名解析,即域名解析也强制走这个 proxy 。另外不需要配置 https.proxy,git 不认的(关于这一点我认识不是很清晰,希望有人解惑)。

推荐使用 socks5 代理,因为 socks5 包含 http(s)。而且 socks5 代理工作在 osi 七层模型中的会话层(第五层),https/http 代理工作在 osi 七层模型的应用层(第七层), socks 代理更加底层。所以就没必要配置 git config --global http.proxy http://127.0.0.1:7890 了。

这样配置的话会使本机所有的 git 服务都走了代理,假如你在良心云上(国内主机)部署了自己的 gitea ,域名 https://gitea.example.com,那么可以只配置 GitHub 的 http proxy ,即

$ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890

设置 SSH Proxy

Linux & macOS

配置文件在用户家目录下的 .ssh/config 其中 nc 程序位于 /usr/bin/nc

$ cat ~/.ssh/config

Host github.com
 Hostname ssh.github.com
 IdentityFile /xxx/.ssh/github_id_rsa
 User git
 Port 443
 ProxyCommand nc -v -x 127.0.0.1:7890 %h %p

nc 就是 netcat ,引用一段描述

netcat is a simple unix utility which reads and writes data across network connections, using TCP or UDP protocol. It is designed to be a reliable "back-end" tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities. Netcat, or "nc" as the actual program is named, should have been supplied long ago as another one of those cryptic but standard Unix tools.

译文: netcat 是一个简单的 unix 实用程序,它使用 TCP 或 UDP 协议跨网络连接读取和写入数据。 它被设计成一个可靠的“后端”工具,可以直接使用或由其他程序和脚本轻松驱动。 同时,它还是一个功能丰富的网络调试和探索工具,因为它几乎可以创建您需要的任何类型的连接,并且具有几个有趣的内置功能。Netcat ,或实际程序命名的“nc”,早就应该作为另一种神秘但标准的 Unix 工具提供。

Windows

Win 下与之对应的 netcat 程序是 connect.exe,程序位于 Git 安装路径 C:\Program Files\Git\mingw64\bin,win 下推荐使用 Git Bash ,路径也是 Linux style

$ cat ~/.ssh/config

Host github.com
 Hostname ssh.github.com
 IdentityFile /c/users/xxx/.ssh/github_id_rsa
 User git
 Port 443
 ProxyCommand "C:\Program Files\Git\mingw64\bin\connect.exe" -S 127.0.0.1:7890 %h %p

补充信息

为什么 hostname 是 ssh.github.com,为什么要用 443 端口,ssh 默认不是 22 端口么?

因为有些木弟子对于 22 端口做了限制,要么禁止了,要么有些抽风,这时经常会遇到如下错误

kex_exchange_identification: Connection closed by remote host

所以如果 22 端口不畅就使用 443 ,安全可靠。ps: 22 端口时 hostname 请填 github.com。这部分请扩展阅读 此文

至于网页访问 GitHub ,借助木弟子访问已然是日常,要么浏览器扩展 SwitchyOmega,要么系统代理,要么直接使用 Clash 的分流策略等等。我的习惯还是使用 Switchy Omega 。

这样配置之后 git clone https://github.com/xxx/yyy.git 或者 git clone git@github.com:xxx/yyy.git 以及 git pullgit push 等等操作都很快了,除非科学的工具不行。

难免有误,欢迎大家补充和纠正。

11577 次点击
所在节点    程序员
49 条回复
oott123
2022-03-28 15:10:02 +08:00
写得很不错,网上确实缺乏一篇这样完整的教程。GitHub 居然还可以用 443 访问 ssh ,挺有意思的
leeyuzhe
2022-03-28 15:16:41 +08:00
学习了,我之前一直不知道 ssh 方式 clone 怎么走代理
ChaosesIb
2022-03-28 15:20:39 +08:00
直接用环境变量 http_proxy 不行吗
XIU2
2022-03-28 15:20:40 +08:00
以前上 Github 没啥问题的时候,当时为了解决 Github 各种文件下载速度慢的问题,我还写了个油猴脚本( Github 增强 - 高速下载)聚合了一些下载 /镜像加速源。

直到去年初观测到 Github 被 SNI 干扰了(当时我还在这里首发了篇简单报告及稳定复现步骤),我这个脚本就显得有多少有点鸡肋了,毕竟现在很多人访问网页都要挂梯子,也就不需要担心文件下载速度慢的问题了。。。
missdeer
2022-03-28 15:21:18 +08:00
原来还有 connect.exe 可以用啊,之前一直只知道 nc
tankeco
2022-03-28 15:39:18 +08:00
再配上 redsocks 和 iptables... 可以让不支持代理的程序上 github (说的就是你 copilot
bootvue
2022-03-28 16:03:27 +08:00
proxifier
AllenHua
2022-03-28 16:05:21 +08:00
@ChaosesIb #3 这种只对 http 有效,使用 ssh 协议 clone 项目时不会读到这个变量的(读到了也不会用)
@XIU2 #4 互联网越来越小
@missdeer #5 我发现 Git Bash 对于路径中的空格处理有 bug ,所以 windows 下使用 Git Bash 按照正文中的配置无法使用,还得调整一下。认证文件改成 c:\users\xxx\.ssh\github_id_rsa 的形式 使用 cmd 和 powershell 是可以借助 connect 程序走代理 clone 的
@tankeco #6 感谢补充。还没用过这个
AllenHua
2022-03-28 16:05:48 +08:00
@bootvue #7 这个确实可以,下载使用过。
Kinnice
2022-03-28 16:08:41 +08:00
tun 模式 /透明代理更加舒服
lazydao
2022-03-28 16:13:20 +08:00
友情提示,这里没有梯子这种敏感词。
devcat9
2022-03-28 16:14:38 +08:00
@lazydao +1 友情提示:V2EX 本身就需要「梯子」访问。
1002xin
2022-03-28 16:26:39 +08:00
对于我来说,一个稳定的代理基本上解决了这几年 GitHub (不仅仅是 GitHub ) 网络的问题
mschultz
2022-03-28 16:27:43 +08:00
👍 不错,很全面了


@oott123 #1 我最近也是发现工作用的服务器屏蔽了 SSH 22 端口对外连接,进而才找到这个 443 端口的方案。GitLab 、Bitbucket 等均有类似方案。

服务器(包括梯子)防火墙屏蔽 22 端口对外连接的情况还挺常见的,有的可能是出于安全原因,比如避免用户恶意扫描别人
ab
2022-03-28 16:52:02 +08:00
收藏一贴
AllenHua
2022-03-28 16:53:52 +08:00
@Kinnice #10 透明代理确实很舒服。我在家里用 N1 做了个,体验良好。但是之前 iptables 有些配置不太会,总是遇到小问题,现在已经比较稳定了。透明代理很香,OpenWrt 将 DHCP 的网关和 dns 两个 option 改成 N1 的 IP ,局域网设备默认获得 IP 地址时自动设置 N1 的网关和 dns 。
@1002xin #13 这个钱还是不能省
AllenHua
2022-03-28 16:55:10 +08:00
@lazydao #11 知道了。但是有其他敏淦词,所以我宁愿自我审查,不然有时候点击 Publish 提示我不准发布…… 然后 403 了,得换个 IP 才能继续访问,这个体验我有过好几次了,实在是不爽,于是预防性自我审查…… 哎
Uplay
2022-03-28 17:14:10 +08:00
@devcat9 不需要了,我现在就是裸连
aaa5838769
2022-03-28 17:28:35 +08:00
学习了
wonderfulcxm
2022-03-28 17:41:42 +08:00
为什么配置了终端代理,curl 可以自动走这个代理,ssh 还要另外设定?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843383

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX