代理环境下R的gert/git2r包推送GitHub报连接错误问题
问题根因
gert和git2r的Git能力均基于libgit2库实现,该库不会自动读取系统原生Git的全局配置,也不会自动继承终端、RStudio图形界面进程的代理环境变量。
你在终端/RStudio内手动执行Git推送能正常运行,是因为这些场景调用的是系统安装的原生Git客户端,原生Git会自动读取你配置的代理规则、走系统代理通道;但libgit2默认没有加载代理配置,直连GitHub时被网络代理拦截,就会返回「无法和服务器建立连接」的错误。
你git_sitrep()中提示的PAT缺少user:email权限不会导致本次连接错误,该问题仅影响拉取GitHub邮箱、创建PR类操作,和网络连通性故障无关。
排查与解决步骤
- 验证代理配置缺失
先在R控制台运行以下命令,检查libgit2当前是否加载了代理配置:
如果返回结果为空,即可确认是代理未配置导致的故障。# 查看libgit2生效的代理配置项 gert::git_config() |> subset(name %in% c("http.proxy", "https.proxy")) - 写入全局代理配置(永久生效)
先打开系统终端,运行git config --global --get https.proxy获取原生Git当前使用的代理地址(常见本地代理格式为http://127.0.0.1:端口号,公司代理按实际地址填写),之后回到R控制台运行以下命令,给libgit2写入全局代理配置:
如果代理需要账号密码认证,将代理地址写为# 将引号内内容替换为你实际查到的代理地址 gert::git_config_global_set("https.proxy", "http://127.0.0.1:替换成你的代理端口") gert::git_config_global_set("http.proxy", "http://127.0.0.1:替换成你的代理端口")http://用户名:密码@代理地址:端口格式即可。 - 会话级临时配置(不修改全局设置)
如果不想修改全局配置,可以每次启动R会话、执行推送操作前,先运行以下命令设置当前会话的代理环境变量,libgit2会自动读取该配置:# 将引号内内容替换为你实际的代理地址 Sys.setenv(HTTPS_PROXY = "http://127.0.0.1:替换成你的代理端口") Sys.setenv(HTTP_PROXY = "http://127.0.0.1:替换成你的代理端口") - 特殊场景处理
如果按上述步骤配置后仍然连接失败,大概率是公司网络使用NTLM认证代理,此时可以在本地启动一个NTLM代理转发端口,将转发后的普通HTTP代理地址填入上述配置即可。
内容的提问来源于stack exchange,提问作者maja zaloznik
相关产品推荐
相关产品推荐

