Клонировать репозиторий 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( ... );
    }
  }
} );