Клонировать репозиторий git по ssh с именем пользователя и паролем Java
Я пытаюсь клонировать проект git с Java через ssh. У меня есть имя пользователя и пароль пользователя git-shell в качестве учетных данных. Я могу клонировать проект в терминале, используя следующую команду без проблем. (Конечно, сначала он запрашивает пароль)
git clone user@HOST:/path/Example.git
однако, когда я пытаюсь следующий код с помощью Jgit api
File localPath = new File("TempProject");
Git.cloneRepository()
.setURI("ssh://HOST/path/example.git")
.setDirectory(localPath)
.setCredentialsProvider(new UsernamePasswordCredentialsProvider("***", "***"))
.call();
я получил
Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: ssh://HOST/path/example.git: Auth fail
Что делать? Есть идеи? (Я использую OSX 10.9.4 и JDK 1.8)
1 ответов
для аутентификации с SSH JGit использует JSch. JSch предоставляет SshSessionFactory
для создания и удаления SSH-соединений. Самый быстрый способ сказать JGit, какая фабрика сеансов SSH должна использоваться, - установить ее глобально через SshSessionFactory.setInstance()
.
JGit предоставляет абстрактное JschConfigSessionFactory
, которого configure
метод может быть переопределен, чтобы предоставить пароль:
SshSessionFactory.setInstance( new JschConfigSessionFactory() {
@Override
protected void configure( Host host, Session session ) {
session.setPassword( "password" );
}
} );
Git.cloneRepository()
.setURI( "ssh://username@host/path/repo.git" )
.setDirectory( "/path/to/local/repo" )
.call();
установить SshSessionFactory
более разумным способом немного сложнее. The CloneCommand
- как и все JGit классы команд, которые могут открыть соединение-наследуется от TransportCommand
. Этот класс имеет setTransportConfigCallback()
метод, который также может использоваться для указания фабрики сеансов SSH для фактической команды.
CloneCommand cloneCommand = Git.cloneRepository();
cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {
@Override
public void configure( Transport transport ) {
if( transport instanceof SshTransport ) {
SshTransport sshTransport = ( SshTransport )transport;
sshTransport.setSshSessionFactory( ... );
}
}
} );