同一个仓库在终端里用 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 成功是有价值的对照,但它回答不了这个与实现相关的问题。

相关文章