2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面了解如何操作的相关更多信息。

0
Clojure

我正在尝试使用Cognitect test_runner依赖来运行测试,当它尝试克隆依赖项时,我得到一个jgit USERAUTH失败。我可以使用其他测试运行器,但我真的很想了解这里发生了什么。很多人都有过这个问题,但我在网上找不到关于该问题的好解释,也没有找到解决方案。如果有人能帮忙,我会很感激!

我在使用

Java 8(也试过11)
Mac 10.15.7(Catalina)

我有一个不带密码的git ssh密钥

能有人为我解释这个问题吗?我有一种想法,这可能与jgit/jsch有关,但我并不完全理解问题所在。

我的 deps.edn

  {:paths ["src" "resources"]
        :deps {org.clojure/clojure {:mvn/version "1.10.2"}}
        :aliases
         { :test {:extra-paths ["test"]
            :extra-deps {com.cognitect/test-runner
                               {:git/url "https://github.com/cognitect-labs/test-runner.git"
                                :sha "209b64504cb3bd3b99ecfec7937b358a879f55c1"}}
            :main-opts ["-m" "cognitect.test-runner"]}}

   
 

clj -A:test 输出

> 克隆:https://github.com/cognitect-labs/test-runner.git 错误

> building classpath. [email protected]:cognitect-labs/test-runner.git:
> USERAUTH fail org.eclipse.jgit.api.errors.TransportException:
> [email protected]:cognitect-labs/test-runner.git: USERAUTH fail
>         at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:248)
>         at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:306)
>         at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:200)
>         at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:89)
>         at clojure.tools.gitlibs.impl$call_with_auth.invokeStatic(impl.clj:52)
>         at clojure.tools.gitlibs.impl$call_with_auth.invoke(impl.clj:43)
>         at clojure.tools.gitlibs.impl$git_clone_bare.invokeStatic(impl.clj:73)
>         at clojure.tools.gitlibs.impl$git_clone_bare.invoke(impl.clj:70)
>         at clojure.tools.gitlibs.impl$ensure_git_dir.invokeStatic(impl.clj:112)
>         at clojure.tools.gitlibs.impl$ensure_git_dir.invoke(impl.clj:102)
>         at clojure.tools.gitlibs$resolve.invokeStatic(gitlibs.clj:33)
>         at clojure.tools.gitlibs$resolve.invoke(gitlibs.clj:29)
>         at clojure.tools.gitlibs$procure.invokeStatic(gitlibs.clj:47)
>         at clojure.tools.gitlibs$procure.invoke(gitlibs.clj:41)
>         at clojure.tools.deps.alpha.extensions.git$eval1316$fn__1318.invoke(git.clj:42)
>         at clojure.lang.MultiFn.invoke(MultiFn.java:239)
>         at clojure.tools.deps.alpha$expand_deps.invokeStatic(alpha.clj:422)
>         at clojure.tools.deps.alpha$expand_deps.invoke(alpha.clj:390)
>         at clojure.tools.deps.alpha$resolve_deps.invokeStatic(alpha.clj:495)
>         at clojure.tools.deps.alpha$resolve_deps.invoke(alpha.clj:475)
>         at clojure.tools.deps.alpha$calc_basis.invokeStatic(alpha.clj:648)
>         at clojure.tools.deps.alpha$calc_basis.invoke(alpha.clj:622)
>         at clojure.tools.deps.alpha.script.make_classpath2$run_core.invokeStatic(make_classpath2.clj:91)
>         at clojure.tools.deps.alpha.script.make_classpath2$run_core.invoke(make_classpath2.clj:57)
>         at clojure.tools.deps.alpha.script.make_classpath2$run.invokeStatic(make_classpath2.clj:119)
>         at clojure.tools.deps.alpha.script.make_classpath2$run.invoke(make_classpath2.clj:113)
>         at clojure.tools.deps.alpha.script.make_classpath2$_main.invokeStatic(make_classpath2.clj:169)
>         at clojure.tools.deps.alpha.script.make_classpath2$_main.doInvoke(make_classpath2.clj:140)
>         at clojure.lang.RestFn.applyTo(RestFn.java:137)
>         at clojure.lang.Var.applyTo(Var.java:705)
>         at clojure.core$apply.invokeStatic(core.clj:667)
>         at clojure.main$main_opt.invokeStatic(main.clj:514)
>         at clojure.main$main_opt.invoke(main.clj:510)
>         at clojure.main$main.invokeStatic(main.clj:664)
>         at clojure.main$main.doInvoke(main.clj:616)
>         at clojure.lang.RestFn.applyTo(RestFn.java:137)
>         at clojure.lang.Var.applyTo(Var.java:705)
>         at clojure.main.main(main.java:40) Caused by: org.eclipse.jgit.errors.TransportException:
> [email protected]:cognitect-labs/test-runner.git: USERAUTH fail
>         at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:172)
>         at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:140)
>         at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:280)
>         at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:170)
>         at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:137)
>         at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:123)
>         at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1269)
>         at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:237)
>         ... 37 more Caused by: com.jcraft.jsch.JSchException: USERAUTH fail
>         at com.jcraft.jsch.UserAuthPublicKey.start(UserAuthPublicKey.java:119)
>         at com.jcraft.jsch.Session.connect(Session.java:470)
>         at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:126)

1 答案

+1

堆栈跟踪表明正在使用SSH传输,尽管你指定的URL是https而不是ssh。使用jgit的SSH传输效果不佳。

使用SSH传输而不是https传输的原因可能是你在~/.gitconfig中有设置,告诉git对于GitHub仓库使用ssh而不是https(这可能是有些人做的一些常见事情)。这应该是一条类似于“insteadOf”的配置文件语句。

工具.deps 的 git 传输正在重新设计,在未来的版本中,它将利用 git 而不是 jgit,在这种情况下,ssh 传输应该更容易解决问题。

by
实际上,git 传输正在完成它应该在这里做的工作,在未来的版本中通过 shell 调用 git,它将执行完全相同的事情。
by
@hiredman 谢谢,这确实是问题所在。

我的 `~/.gitconfig` 中有以下内容:

```
[url "[email protected]:"]
       insteadOf = https://github.com/
```

所以当 clojure/clj 别名下载测试运行器依赖项时使用 "https://..",`instead_of` 配置会将其切换至 ssh 路径 `[email protected]`。

除去这次外,我可能还会遇到想要进行此类映射的情况,但现在我会有所警觉。
by
感谢 @alexmiller 的回复。不过,如果 `clj` 不注意 ~/.gitconfig 中的 `insteadOf` 是否好呢?鉴于它想要始终使用 https 而不是 ssh?
by
clj 可以使用 https 或 ssh(假设你的配置工作正常,目前可能有点棘手 - 但关于这一点的最佳做法和更好的时光即将到来)。在我看来,clj 能做的最好的事情就是匹配 git 的行为,从而有一个可关注的配置类型(不是 git 配置 + 另一个特殊情况的层级)。
by
感谢Alex,能否提供关于如何配置ssh的参考资料?因为这个过程很棘手。你能告诉我有关何时进行的较好信息吗?:)
...