Как вы устанавливаете конфигурацию для 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
(это было из-за неправильной конфигурации сети)