Как вы устанавливаете конфигурацию для jschconfigsessionfactory для jgit, чтобы тянуть и толкать работу?

Я пытаюсь сделать git pull / push с помощью api Jgit со следующим кодом

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 и pushing работает.

Я попытался проверить так, например, код

Java клиента git помощью jgit

но приведенный выше вопрос не дает полного закодированного примера того, что необходимо сделать git pull с удаленным РЕПО, которое обычно аутентификация через ssh ключи. Должен быть способ получить информацию о учетных данных от ~/.ssh/ или эквивалент windows.

3 ответов


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);

проблема 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 dj: https://github.com/bmillare/dj/blob/library/src/dj/git.clj


Я смутно помню, что получил ошибку с JSch, которая заблокировала меня на некоторое время, потому что журнал не был очень явным. Я не могу сказать наверняка, что это та же проблема, но я последовал этой странице, чтобы решить свою проблему:

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

(именно из-за неправильной конфигурации сети)