2014-09-20 16 views
5

Sto provando a clonare un progetto git con Java su ssh. Ho username e password di un utente git-shell come credenziali. Posso clonare il progetto in terminale usando il seguente comando senza problemi. (Naturalmente, chiede la password prima)Clone git repository su ssh con nome utente e password Java

git clone [email protected]:/path/Example.git 

Tuttavia quando provo il seguente codice utilizzando JGIT api

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

ho ottenuto

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

Cosa devo fare? Qualche idea? (Sto usando OSX 10.9.4 e JDK 1.8)

+0

Probabilmente si può usare 'http' per URI git repository se si desidera utilizzare il nome utente e la password come provider di credenziali. –

+0

nome utente e password sono per utente ssh su Ubuntu Server. –

+0

Forse qualcosa relativo a jgit.transport.SshConfigSessionFactory ??? –

risposta

5

Per l'autenticazione con SSH, JGit utilizza JSch. JSch fornisce uno SshSessionFactory per creare ed eliminare connessioni SSH. Il modo più rapido per dire a JGit quale SSH deve essere utilizzato è impostarlo globalmente attraverso SshSessionFactory.setInstance().

JGit fornisce un riassunto JschConfigSessionFactory, la cui configure metodo può essere alterato in modo da fornire la password:

SshSessionFactory.setInstance(new JschConfigSessionFactory() { 
    @Override 
    protected void configure(Host host, Session session) { 
     session.setPassword("password"); 
    } 
}); 
Git.cloneRepository() 
    .setURI("ssh://[email protected]/path/repo.git") 
    .setDirectory("/path/to/local/repo") 
    .call(); 

Per impostare il SshSessionFactory in maniera più sensibile è leggermente più complessa. Il CloneCommand - come tutte le classi di comando JGit che possono aprire una connessione - eredita da TransportCommand. Questa classe ha un metodo setTransportConfigCallback() che può essere utilizzato anche per specificare il factory di sessione SSH per il comando effettivo.

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

@NuriTasdemir Ho migliorato la risposta con il tuo snippet di codice e ti consiglio di ripristinare la domanda nella sua forma originale per preservare il carattere di Q & A. Altri troveranno la risposta _best_ come prima (e che potrebbe essere diversa dalla mia in futuro). –

+0

Per compilare questo codice in Eclipse ho dovuto includere jsch.jar (per com.jcraft.jsch.Session) Tuttavia questa volta quando eseguo il programma (che è un plugin Eclipse che dipende dal plugin di jgit), ho ottenuto il seguente errore java.lang.LinkageError: violazione del vincolo del loader: caricatore avviato in precedenza per caricare un tipo diverso con nome "com/jcraft/jsch/Session" Qualche idea? –

+0

Potrebbe essere che questo è relativo a [bug 420903] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=420903)? In caso contrario, consiglio di inviare una domanda separata e fornire maggiori dettagli sulla versione di JGit, sulla versione di JSch, sul manifest del bundle, ecc. –