Как вы устанавливаете конфигурацию для 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 и push работает.

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

Java-клиент git, использующий jgit

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

3 ответа

Решение

Проблема в том, что Jsch не поддерживает ssh-agentиз коробки. Нужно настроить 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 автоматически обнаружит ваши 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, которая на какое-то время блокировала меня, потому что журнал был не очень явным. Я не могу точно сказать, что это та же самая проблема, но я следовал за этой страницей, чтобы решить мою проблему:

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

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

Другие вопросы по тегам