2013-04-05 30 views
5

Utilizzando jgit con gitolite per il controllo del codice sorgente, ho un'applicazione che genera un determinato codice su comando e che vogliamo venga eseguito il commit al controllo del codice sorgente. L'obiettivo è quello di tirare con un avanzamento veloce, commettere il nuovo codice e quindi premerlo.Configurazione di known_hosts in jgit

ho il seguente metodo:

private void commitToGitRepository(String updateComment, Config config) 
     throws IOException, NoFilepatternException, GitAPIException 
{ 
    if(git == null) 
    { 
     git = Git.open(new File(config.getDpuCheckoutDir())); 
    } 
    PullCommand pull = git.pull(); 
    pull.call(); 
} 

Questo metodo non riesce la chiamata pull.call() metodo, con la seguente eccezione:

com.jcraft.jsch.JSchException: UnknownHostKey: www.somehost.com. RSA key fingerprint is 9d:92:a9:c5:5d:cb:5f:dc:57:ff:38:7e:34:31:fe:75 
at com.jcraft.jsch.Session.checkHost(Session.java:748) 
at com.jcraft.jsch.Session.connect(Session.java:319) 
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:116) 
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:121) 
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:248) 
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:147) 
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136) 
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122) 
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1104) 
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128) 
at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:245) 
at net.intellidata.dpu.controller.schema.EntityMappingController.commitToGitRepository(EntityMappingController.java:149) 
... (truncated where it meets my code) 

Il modo in cui ho letto questo, sembra che non è trovare il mio file known_hosts in user_home/.git. Tuttavia, ho cercato un'ora e non trovo un modo per configurare JGit per dire a JSch dove cercare il file known_hosts.

Suggerimenti? So che la voce per l'origine è presente nel mio file known_hosts

risposta

7

This answer menzioni:

jsch.setKnownHosts("C:\\Users\\aUsername\\known_hosts"); 

Ma si sta utilizzando jgit, e nonjsch (the Java secure shell) direttamente, e vediamo:

C:\Users\VonC\prog\git>git clone https://github.com/eclipse/jgit 
Cloning into 'jgit'... 
remote: Counting objects: 37854, done. 
remote: Compressing objects: 100% (7743/7743), done. 
remote: Total 37854 (delta 22009), reused 34367 (delta 18831) 
Receiving objects: 100% (37854/37854), 6.73 MiB | 1.37 MiB/s, done. 
Resolving deltas: 100% (22009/22009), done. 

C:\Users\VonC\prog\git>cd jgit 

C:\Users\VonC\prog\git\jgit>grep -nrHI "setKnownHosts" * 
org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java:262:        sch.setKnownHosts(in); 

Trovato!

questo viene da JschConfigSessionFactory.java#knownHosts(), e si presenta come:

new File(new File(home, ".ssh"), "known_hosts"); 
# with: 
home = fs.userHome(); 

userHome si basa su System.getProperty("user.home").

Quindi assicurati che la tua sessione java abbia un user.home defined e che ci sia un file %USERPROFILE%/.ssh/known_hosts.

(user.home deve essere impostato da java a %USERPROFILE% per Windows, vale a dire, se si è su Windows: in alcuni casi, this won't always work).


Ora, se si fa hanno un %USERPROFILE%/.ssh/known_hosts, poi, come mentioned here

Proprio SSH al client (utilizzando a riga di comando ssh strumento), Questo aggiungerà voce al ~/.ssh/known_hosts file.


In questo caso, il StormeHawke menzioni in the comments:

da quando corro in questo Tomcat come servizio di Windows, JSch (e per estensione JGit) non era alla ricerca nella mia cartella utente ma nella cartella SYSTEM per la cartella .ssh.
In questo caso sono andato avanti e ho appena copiato la cartella .ssh nella cartella principale SYSTEM poiché Tomcat viene eseguito solo sulla mia macchina per scopi di sviluppo e test (probabilmente non è la migliore politica di sicurezza ma il rischio è minimo in questo caso).

Da this question, this one, quella directory per il LocalSystem Account dovrebbe essere:

C:\Documents and Settings\Default User 
# or Wind7/2008 
C:\Windows\System32\Config\systemprofile 

Il PO cita:

Secondo questa chiamata:

System.out.println(System.getProperty("user.home")); 

il default SYSTEM hom La directory per Windows7 (e presumibilmente qualsiasi altro sistema Windows basato su NT) è semplicemente C:\.
(quindi non ideale, ma per una soluzione rapida, funziona).

+0

Tu, signore, sei un genio. Stavo battendo la mia testa contro il muro cercando di capire perché non stava riconoscendo la voce known_hosts quando improvvisamente mi sono reso conto che, dal momento che sto eseguendo questo in Tomcat come servizio Windows, Jsch (e per estensione JGit) era cercando non nella _my_ cartella utente ma nella cartella home dell'account _SYSTEM_ per la cartella .ssh. In questo caso sono andato avanti e ho appena copiato la cartella .ssh nella cartella home SYSTEM poiché Tomcat viene eseguito solo sulla mia macchina per scopi di sviluppo e test (probabilmente non è la migliore politica di sicurezza ma il rischio è minimo in questo caso). Grazie! – StormeHawke

+0

@StormeHawke Eccellente! Ho incluso il tuo commento nella risposta per maggiore visibilità. Qual è stata la directory per il tuo account SYSTEM? Ho inviato alcuni suggerimenti, ma non sono sicuro della posizione esatta. – VonC

+0

In base a questa chiamata: 'System.out.println (System.getProperty (" user.home "));' la directory home SYSTEM di default per Windows7 (e presumibilmente qualsiasi altro sistema Windows basato su NT) è semplicemente 'C : \\ ' – StormeHawke