9

我正在尝试使用 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 也可以。

我尝试检查示例代码

使用 jgit 的 Java git 客户端

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

4

3 回答 3

12

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);
于 2013-03-08T09:39:19.523 回答
3

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

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

有关详细信息,请参阅我的 clojure 库 dj:https ://github.com/bmillare/dj/blob/library/src/dj/git.clj

于 2012-09-21T19:59:56.297 回答
-1

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

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

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

于 2012-09-19T21:19:49.920 回答