2012-09-19 13 views
8

Sto cercando di fare un git pull/push utilizzando API jgit con il seguente codiceCome si imposta la configurazione di jschconfigsessionfactory per jgit in modo che pull and push lavori?

org.eclipse.jgit.api.Git.open(theRepoFile).pull().call() 

ma io sono sempre eccezioni

JSchException Auth fail 
com.jcraft.jsch.Session.connect (Session.java:461) 
org.eclipse.jgit.transport.JschConfigSessionFactory.getSession (JschConfigSessionFactory.java:116) 
org.eclipse.jgit.transport.SshTransport.getSession (SshTransport.java:121) 
org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init> (TransportGitSsh.java:306) 
org.eclipse.jgit.transport.TransportGitSsh.openPush (TransportGitSsh.java:152) 
org.eclipse.jgit.transport.PushProcess.execute (PushProcess.java:130) 
org.eclipse.jgit.transport.Transport.push (Transport.java:1127) 
org.eclipse.jgit.api.PushCommand.call (PushCommand.java:153) 

Anche se utilizzando CGIT tirare e spingere opere.

Ho provato controllando così per esempio codice

Java git client using jgit

ma la domanda di cui sopra non fornisce un esempio completo codificata di ciò che è necessario fare un git tirare con un repo remoto che normalmente autenticato tramite ssh chiavi. Ci dovrebbe essere un modo per ottenere le informazioni sulle credenziali da ~/.ssh/ o l'equivalente di Windows.

risposta

3

Il problema è JSch non supporto ssh-agent s out of the box. Uno avrà bisogno di configurare https://github.com/ymnk/jsch-agent-proxy per farlo funzionare.

Un'alternativa è creare il proprio org.eclipse.jgit.transport.CredentialsProvider e impostare org.eclipse.jgit.transport.CredentialItem sui valori corretti (richiedendoli all'utente o cercando un file). È possibile modificare il valore predefinito CredentialsProvider con org.eclipse.jgit.transport.CredentialsProvider/setDefault

Vedere il mio clojure biblioteca dj per i dettagli: https://github.com/bmillare/dj/blob/library/src/dj/git.clj

+0

così hai provato e ha funzionato? Potresti descriverlo in maggiori dettagli, cosa c'è esattamente da fare? integrare il proxy nel proprio codice? Ciò aiuterà il prossimo sviluppatore ad avere questo problema. – Vince

+0

In realtà non ho usato jsch-agent-proxy, ho creato il mio CredentialsProvider che chiedeva all'utente la passphrase.In realtà è scritto in clojure ma i dettagli ci sono. https://github.com/bmillare/dj/blob/library/src/dj/git.clj – bmillare

-1

Ricordo vagamente di aver ricevuto un errore con JSch che mi ha bloccato per un po 'perché il registro non era molto esplicito. Non posso dire per certo è lo stesso problema, ma ho seguito questa pagina per risolvere il mio problema:

https://help.github.com/articles/generating-ssh-keys

(era a causa di una configurazione di rete sbagliata)

+0

Il link che hai postato non ha jgit specifico. Ho detto che sono in grado di usare git normale, il che significa che le chiavi SSH vanno bene. Una possibilità è che io usi gli strumenti portachiavi di Gentoo, il che può essere qualcosa che jgit non sa come affrontare. – bmillare

+0

se non vuoi ascoltare ciò che la gente dice, non chiedere. "perché il log non era molto esplicito" potrebbe non essere abbastanza chiaro: ho perso giorni di lavoro cercando solo nella tua stessa direzione, con Git perfettamente funzionante. Non sono sicuro di quale sia la mia risposta, perché è un vago ricordo, ma se non ci provi, almeno sei sicuro che non funzionerà meglio. E infatti non è legato a jGit buit se trovi una pagina con scritto sia jGit che ssh config, sentiti libero di postarla, l'obiettivo qui è che il prossimo lettore trovi informazioni utili. – Vince

+0

oh e, nel complesso, lo imparerai con il tempo, ma Git è molto più tollerante con strani usi di jGit. – Vince

11

JSch rileva automaticamente le chiavi SSH, ma non riuscirà se questi sono protetti da una password. Devi specificare la passphrase tramite CredentialsProvider in questo modo:

JschConfigSessionFactory sessionFactory = new JschConfigSessionFactory() { 
@Override 
protected void configure(OpenSshConfig.Host hc, Session session) { 
    CredentialsProvider provider = new CredentialsProvider() { 
     @Override 
     public boolean isInteractive() { 
      return false; 
     } 

     @Override 
     public boolean supports(CredentialItem... items) { 
      return true; 
     } 

     @Override 
     public boolean get(URIish uri, CredentialItem... items) throws UnsupportedCredentialItem { 
      for (CredentialItem item : items) { 
       ((CredentialItem.StringType) item).setValue("yourpassphrase"); 
      } 
      return true; 
     } 
    }; 
    UserInfo userInfo = new CredentialsProviderUserInfo(session, provider); 
    session.setUserInfo(userInfo); 
} 
}; 
SshSessionFactory.setInstance(sessionFactory); 
+0

Grazie mille per questo - ho avuto difficoltà con l'autenticazione SSH per JGit, ho trovato questo e ha risolto subito il mio problema . Grazie molto. –

+0

@JoPintoPaul: ho provato a farlo usando lo snippet simile. Potrebbe per favore aiutare. La mia domanda è: https://stackoverflow.com/questions/45889326/userauth-fail-using-jgit-to-access-git-repo-securely-for-pullcommand – mohanjot