您如何为 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-agent
s。需要配置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 的配置以便拉取和推送工作?的主要内容,如果未能解决你的问题,请参考以下文章