java git ssh jgit

Clonar el repositorio git sobre ssh con nombre de usuario y contraseña por Java



jgit (1)

Estoy intentando clonar un proyecto de git con Java sobre ssh. Tengo el nombre de usuario y la contraseña de un usuario de git-shell como credenciales. Puedo clonar el proyecto en la terminal usando el siguiente comando sin problemas. (Por supuesto, primero solicita la contraseña)

git clone user@HOST:/path/Example.git

Sin embargo, cuando intento el siguiente código usando JGIT api

File localPath = new File("TempProject"); Git.cloneRepository() .setURI("ssh://HOST/path/example.git") .setDirectory(localPath) .setCredentialsProvider(new UsernamePasswordCredentialsProvider("***", "***")) .call();

tengo

Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: ssh://HOST/path/example.git: Auth fail

¿Que debería hacer? ¿Algunas ideas? (Estoy usando OSX 10.9.4 y JDK 1.8)


Para la autenticación con SSH, JGit usa JSch . JSch proporciona una SshSessionFactory para crear y eliminar conexiones SSH. La forma más rápida de indicarle a JGit qué fábrica de sesiones SSH debería utilizarse es establecerla globalmente a través de SshSessionFactory.setInstance() .

JGit proporciona una JschConfigSessionFactory abstracta, cuyo método de configure se puede anular para proporcionar la contraseña:

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

Configurar SshSessionFactory de una manera más sensata es un poco más complejo. El CloneCommand , como todas las clases de comando JGit que pueden abrir una conexión, hereda de TransportCommand . Esta clase tiene un método setTransportConfigCallback() que también se puede usar para especificar la fábrica de sesiones SSH para el comando real.

CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setTransportConfigCallback( new TransportConfigCallback() { @Override public void configure( Transport transport ) { if( transport instanceof SshTransport ) { SshTransport sshTransport = ( SshTransport )transport; sshTransport.setSshSessionFactory( ... ); } } } );