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