您如何为 jgit 设置 jschconfigsessionfactory 的配置以便拉取和推送工作?

Posted

技术标签:

【中文标题】您如何为 jgit 设置 jschconfigsessionfactory 的配置以便拉取和推送工作?【英文标题】:How do you set the configuration for jschconfigsessionfactory for jgit so that pull and push work? 【发布时间】: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 等效项获取凭据信息。

【问题讨论】:

【参考方案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 来执行此操作。请帮忙。我的问题是:***.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 会理清头绪。

以上是关于您如何为 jgit 设置 jschconfigsessionfactory 的配置以便拉取和推送工作?的主要内容,如果未能解决你的问题,请参考以下文章

您如何为委托参数提供 xml 注释/文档?

您如何为 angularjs 可重用组件打包资产?

您如何为 webgl 应用程序创建验收测试?

您如何为 ORM 的分页定义中继连接?

您如何为 Google Cloud 平台签署 HIPAA BAA?

您如何为 Stripe 结帐会话生成付费发票 PDF?