原生 Git 能通过代理工作,JGit 却不能
JGit 是 Java 实现,有自己支持的传输设置。原生 Git 中的 http.proxy 条目并不是适用于所有 Git 客户端的通用配置。
同一个仓库在终端里用 git clone 能正常工作,在使用 JGit 的应用中却失败。这是两种实现之间的对比,未必是同一个客户端“能用的副本”和“坏掉的副本”之间的对比。
JGit 的配置参考指出,代理配置通过 java.net.ProxySelector 使用 Java 的标准机制。不要因为两个客户端都认识 Git 配置文件,就认为原生 Git 的每个 HTTP 选项都已实现。
确认是哪个应用内嵌了 JGit、它的版本以及所选的 HTTP 传输方式。宿主应用可能在 JGit 自身的默认值之外提供设置或行为。
然后检查该进程可见的 Java 代理配置。对于基于 URLConnection 的 HTTP 传输,查看它使用的 JVM 主机和端口属性。应用启动后在无关终端里输入的属性无法重新配置正在运行的 JVM。IDE 的原生 Git 操作与其 JGit 操作也可能走不同的路径。
把代理身份验证与路由选择分开。只指定主机和端口的 Java 代理属性并不会自动实现代理密码方案。请使用宿主应用支持的身份验证机制。
有用的问题是“这个 JGit 请求选了哪个代理?”,而不是“我的 Git 配置里有没有代理行?”。原生 Git 成功是有价值的对照,但它回答不了这个与实现相关的问题。