【问题标题】:How do you set the configuration for jschconfigsessionfactory for jgit so that pull and push work?您如何为 jgit 设置 jschconfigsessionfactory 的配置以便拉取和推送工作?
【发布时间】:2012-09-12 05:15:13
【问题描述】:

我正在尝试使用 jgit 的 api 和以下代码进行 git pull/push

org.eclipse.jgit.api.Git.open(theRepoFile).pull().call()

但我遇到了异常

JSchException Auth fail
com.jcraft.jsch.Session.connect (Session.java:461)
org.eclipse.jgit.transport.JschConfigSessionFactory.getSession (JschConfigSessionFactory.java:116)
org.eclipse.jgit.transport.SshTransport.getSession (SshTransport.java:121)
org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init> (TransportGitSsh.java:306)
org.eclipse.jgit.transport.TransportGitSsh.openPush (TransportGitSsh.java:152)
org.eclipse.jgit.transport.PushProcess.execute (PushProcess.java:130)
org.eclipse.jgit.transport.Transport.push (Transport.java:1127)
org.eclipse.jgit.api.PushCommand.call (PushCommand.java:153)

即使使用 cgit pull 和 push 也可以。

我尝试检查 SO 示例代码

Java git client using jgit

但上述问题并未提供完整的编码示例,说明使用通常通过 ssh 密钥进行身份验证的远程仓库执行 git pull 所需的内容。应该有一种方法可以从 ~/.ssh/ 或 windows 等效项获取凭据信息。

【问题讨论】:

    标签: java jsch jgit


    【解决方案1】:

    Jsch 将自动检测您的 SSH 密钥,但如果这些密钥受密码保护,则会失败。您需要像这样通过 CredentialsProvider 指定密码:

    JschConfigSessionFactory sessionFactory = new JschConfigSessionFactory() {
    @Override
    protected void configure(OpenSshConfig.Host hc, Session session) {
        CredentialsProvider provider = new CredentialsProvider() {
            @Override
            public boolean isInteractive() {
                return false;
            }
    
            @Override
            public boolean supports(CredentialItem... items) {
                return true;
            }
    
            @Override
            public boolean get(URIish uri, CredentialItem... items) throws UnsupportedCredentialItem {
                for (CredentialItem item : items) {
                    ((CredentialItem.StringType) item).setValue("yourpassphrase");
                }
                return true;
            }
        };
        UserInfo userInfo = new CredentialsProviderUserInfo(session, provider);
        session.setUserInfo(userInfo);
    }
    };
    SshSessionFactory.setInstance(sessionFactory);
    

    【讨论】:

    • 非常感谢 - 我在为 JGit 进行 SSH 身份验证时遇到了困难,找到了这个并立即解决了我的问题。非常感谢。
    • @JoPintoPaul :我尝试使用类似的 sn-p 来执行此操作。请帮忙。我的问题是:stackoverflow.com/questions/45889326/…
    【解决方案2】:

    问题是 Jsch 不支持开箱即用的ssh-agents。需要配置https://github.com/ymnk/jsch-agent-proxy 才能使其工作。

    另一种方法是创建自己的org.eclipse.jgit.transport.CredentialsProvider 并将org.eclipse.jgit.transport.CredentialItem 设置为正确的值(通过向用户请求它们或查找文件)。您可以将默认的CredentialsProvider 更改为org.eclipse.jgit.transport.CredentialsProvider/setDefault

    详情请看我的clojure library dj:https://github.com/bmillare/dj/blob/library/src/dj/git.clj

    【讨论】:

    • 你试过了吗?您能否更详细地描述它,具体要做什么?将代理集成到一个人的代码中?这将有助于下一个遇到此问题的开发人员。
    • 我实际上没有使用 jsch-agent-proxy,我制作了自己的 CredentialsProvider,它要求用户输入密码。它实际上是用 clojure 编写的,但细节在那里。 github.com/bmillare/dj/blob/library/src/dj/git.clj
    【解决方案3】:

    我隐约记得在 JSch 中遇到了一个错误,因为日志不是很明确,所以我被阻止了一段时间。我无法确定这是同一个问题,但我按照此页面解决了我的问题:

    https://help.github.com/articles/generating-ssh-keys

    (这是由于网络配置错误)

    【讨论】:

    • 您发布的链接没有特定于 jgit 的内容。我说我可以使用普通的 git,这意味着 ssh 密钥很好。一种可能是我使用了 gentoo 钥匙串工具,这可能是 jgit 不知道如何处理的东西。
    • 如果你不想听别人说什么,就别问了。 “因为日志不是很明确”可能不够清楚:我失去了几天的工作,只看和你一样的方向,Git 工作得很好。我不确定我的答案有什么价值,因为它是一个模糊的记忆,但如果你不尝试,至少你确定它不会更好地工作。如果你发现一个页面同时写了 jGit 和 ssh 配置,它确实与 jGit 无关,请随意发布它,这里的目标是让下一个读者找到有用的信息。
    • 哦,总的来说,随着时间的推移你会学会它,但 Git 比 jGit 更能容忍奇怪的用法。
    • 请不要把它当作私人的。我不是在攻击你的努力,但我建议澄清一下。 (请注意没有投反对票。)继续前进,您的 cmets 会理清头绪。
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2020-02-05
    • 2021-10-21
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多