報錯完整信息
初步原因是這樣
報錯是 Python 的 http.client.RemoteDisconnected,意思是 在用 urllib 請求遠程 URL 時,遠程服務器直接斷開了連接,沒有返回任何響應。在你的堆棧里,它出現在 pre-commit 嘗試安裝 Golang 環境的時候,也就是這一行:
resp = urllib.request.urlopen(_get_url(version))
也就是說 pre-commit 想下載 Go 的某個版本,但連接遠程服務器失敗了
詳細原因如下
本人電腦的環境是ubantu22.04,代理軟件是v2ray。
由于v2ray的代理協議是socks5,而urllib 請求遠程 URL走的是http協議,不支持socks5協議。
解決辦法如下
使用privoxy工具,它的作用是將http協議的消息轉為socks5協議的消息
具體工作流如下
-
應用程序 → HTTP請求 → Privoxy (8123端口)
-
Privoxy → 轉換協議 → SOCKS5請求 → V2Ray (1080端口)
-
V2Ray → 處理請求 → 目標網站
-
目標網站 → 響應 → V2Ray → Privoxy → 應用程序
具體操作如下
第一步:編輯配置文件:
sudo nano /etc/privoxy/config
在配置文件中,找到或添加以下兩行,確保它們沒有被注釋掉(行首沒有 #):
listen-address 127.0.0.1:8123
forward-socks5t / 127.0.0.1:1080 .
將你的V2Ray_SOCKS5端口替換為你V2Ray配置中inbounds協議為socks的端口號(例如 1080)。注意:forward-socks5t 行末尾有一個點號.和空格,不要遺漏。
第二步:啟動Privoxy服務并設置開機自啟:
sudo systemctl start privoxy
sudo systemctl enable privoxy
sudo systemctl status privoxy # 檢查狀態,確保其為active (running)
第三步:設置環境變量,使用Privoxy的HTTP代理
export http_proxy="http://127.0.0.1:8123"
export https_proxy="http://127.0.0.1:8123"
為了長期使用,可添加到~/.bashrc文件的末尾
第四步:為防止DNS污染,也就是本地DNS解析不了國外的網站的ip。可在/etc/hosts文件中注明網站的ip
以golang官網為例
173.194.75.141 golang.org
216.58.200.238 golang.org
大功告成(如果還是出現上述報錯,就再運行一次pre-commit run --all-files,這可能是網絡代理的網絡穩定性有關系)