请在2024年Clojure状态调查中分享您的想法!

欢迎!有关更多信息,请参阅关于页面。

+1
tools.deps

当前使用JGit+JSch存在问题很多

还不支持通过HTTPS进行认证,而这种认证方式是私有仓库中非常常用的传输方式。Git(主线二进制文件)使用“凭证助手”作为认证预言机。
通过JSch的SSH认证用户体验差,不支持一些现代KEX方法
一些不太常见的.ssh/config选项会破坏克隆,因为底层的Java SSH库(JSch)误读了.ssh/config文件
通过SSH-agent支持ed25519标识密钥,但不通过~/.ssh/config条目。当存在代理和ssh/config时,JSch会迷惑
Clojure中的终端不是交互式的,因此您无法接受未知的主机公钥 - 这可能是可以的,但用户失败时可能不知道该怎么办。

如果仍然兼容Windows支持,将gitlibs移植到shell调用git将有助于解决所有这些问题。这正是Python和Go所做的(shell调用)。它还将缓解许多用户报告的暂时性问题,这些问题没有相关的票据。

TDEPS-49
TDEPS-33
TDEPS-31

建议的补丁(与tools.gitlibs兼容的API)
https://github.com/ghadishayban/tools.gitlibs/pull/1

6 个答案

+1
_评论由:mfikes_做出

放弃JGit + JSch的另一个原因,如果尚未捕获:JSch无法读取新的OpenSSH密钥格式,这些格式现在是macOS默认写入的。

以下是一个示例


$ ssh-keygen -f /tmp/foo


这创建了一个带头部的密钥


-----BEGIN OPENSSH PRIVATE KEY-----


如果您这样做


$ ssh-keygen -m PEM -f /tmp/bar


您将得到一个带常规头部(和密钥格式)的密钥


-----BEGIN RSA PRIVATE KEY-----


为了说明最新的JSch无法读取这种新密钥类型,请注意尝试读取{{"/tmp/foo"}}时出现{{invalid privatekey}}错误


$ clj -Sdeps '{:deps {com.jcraft/jsch {:mvn/version "0.1.55"}}}'
Clojure 1.10.0
user=> (import (com.jcraft.jsch JSch KeyPair))
com.jcraft.jsch.KeyPair
user=> (KeyPair/load (JSch.) "/tmp/foo")
执行错误(JSchException)在com.jcraft.jsch.KeyPair/load (KeyPair.java:664)。
无效的私钥:[B@485e36bc
用户=> (KeyPair/load (JSch.) "/tmp/bar")
#对象[com.jcraft.jsch.KeyPairRSA 0x38f116f6 "com.jcraft.jsch.KeyPairRSA@38f116f6"]
+1
_评论者:ryan_

可能与macOS 10.15也存在相关问题。我在运行10.15测试版2,而tools.deps无法访问我的私有`:git/url`库。

我在macOS 10.12下生成的`id_rsa`可以在macOS 10.14和1.10.1.447的clojure cli下成功拉取私有git依赖。

当我使用这个id_rsa与macOS 10.15b2一起时,任何`clojure`或`clj`命令都会因构建classpath时出错而崩溃

`org.eclipse.jgit.api.errors.TransportException: [email protected]:opengb/spork.git: USERAUTH fail`

如果我在macOS 10.15下生成`id_rsa`,错误是

`org.eclipse.jgit.api.errors.TransportException: [email protected]:opengb/spork.git: invalid privatekey: [B@3d3a1903`

我猜这可能在9月份macOS 10.15发布时影响更多的我们这样的Mac用户。我的解决方案是手动将`~/.gitlibs`与我的旧10.14机器匹配,并使用bash脚本来拉取/打包。
+1

JGit的最新版本不再使用JSch,已转向Apache MINA sshd。现在应该支持新的密钥格式等。

https://wiki.eclipse.org/JGit/New_and"Noteworthy/5.2

0

评论者:colinfleming

如果我们走这条路,我想要考虑的是为Cursive(参见TDEPS-81)等工具实现进度监视器。我不知道当切换到git时这是否可能 - 我相信JGit确实提供了可以被钩入的东西。

0

评论者:ryan

哦,顺便说一下,这些密钥有密码,所以我正在使用ssh-agent。 ssh-add -l看起来不错,并且在环境变量中设置了SSH_AUTH_SOCK

0
参考:https://clojure.atlassian.net/browse/TDEPS-91 (由 gshayban 报告)
...