2013-04-05 11 views
5

Mit Jgit mit Gitolit für die Quellcodeverwaltung, ich habe eine Anwendung, die bestimmten Code auf Befehl generiert und die wir an die Quellcodeverwaltung Committed werden möchten. Das Ziel ist es, mit einem schnellen Vorlauf zu ziehen, den neuen Code zu committen und dann zu drücken.Konfigurieren von bekannten_Hosts in JGIT

Ich habe die folgende Methode:

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

Diese Methode schlägt fehl, auf dem pull.call() Methodenaufruf, mit folgenden Ausnahme:

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) 

So wie ich diese Zeilen lesen, so scheint es, dass es nicht zu finden Meine known_hosts-Datei in user_home/.git. Ich habe jedoch nach einer Stunde gesucht und finde keine Möglichkeit, JGit so zu konfigurieren, dass es JSch mitteilt, wo es nach der Datei known_hosts suchen soll.

Vorschläge? Ich weiß, dass der Eintrag für den Ursprung vorhanden ist, in meiner Datei known_hosts

Antwort

7

This answer erwähnt:

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

Aber Sie verwenden JGit und nichtjsch (the Java secure shell) direkt, also mal sehen:

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

Es gefunden!

Das kommt von JschConfigSessionFactory.java#knownHosts(), und sieht aus wie:

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

userHome auf System.getProperty("user.home") basiert.

So stellen Sie sicher, dass Ihre Java-Sitzung eine user.home defined hat, und dass Sie eine %USERPROFILE%/.ssh/known_hosts Datei dort haben.

(user.home sollte von Java auf %USERPROFILE% für Windows festgelegt werden, das heißt, wenn Sie unter Windows sind: in einigen Fällen this won't always work).


Nun, wenn Sie tun haben eine %USERPROFILE%/.ssh/known_hosts, dann, als mentioned here

Nur SSH an den Client (Kommandozeilen ssh Tool) ist der Eintrag zu Ihrem ~/.ssh/known_hosts file hinzufügen.


In diesem Fall nennt die StormeHawke in the comments:

da ich dies als Windows-Dienst in Tomcat renne, JSch (und durch Erweiterung JGit) wurde nicht auf der Suche in meinem Benutzerordner, aber in SYSTEM Konto Ordner für die .ssh Ordner.
In diesem Fall ging ich voran und kopierte einfach den Ordner .ssh in den SYSTEM Home-Ordner, da Tomcat nur auf meinem Computer zu Entwicklungs- und Testzwecken läuft (wahrscheinlich nicht die beste Sicherheitsrichtlinie, aber das Risiko ist in diesem Fall minimal).

Von this question, this one, das Verzeichnis für die LocalSystem Account sollte sein:

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

Die OP erwähnt:

Nach diesem Aufruf:

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

der Standard SYSTEM hom Das Verzeichnis für Windows7 (und vermutlich jedes andere NT-basierte Windows-System) ist einfach C:\.
(also nicht ideal, aber für eine schnelle Lösung, es funktioniert).

+0

Sie, Sir, sind ein Genie. Ich hatte meinen Kopf gegen die Wand geschlagen und versuchte herauszufinden, warum er den Eintrag von known_hosts nicht erkannte, als mir plötzlich auffiel, dass Jsch (und damit auch JGit) in Tomcat als Windows-Dienst lief Sie suchen nicht im _my_ Benutzerordner, sondern im Homeordner des _SYSTEM_-Kontos nach dem Ordner .ssh. In diesem Fall habe ich den Ordner .ssh einfach in den Home-Ordner SYSTEM kopiert, da Tomcat nur zu Entwicklungs- und Testzwecken auf meinem Computer läuft (wahrscheinlich nicht die beste Sicherheitsrichtlinie, aber das Risiko ist in diesem Fall minimal). Vielen Dank! – StormeHawke

+0

@StormeHawke Ausgezeichnet! Ich habe Ihren Kommentar in die Antwort für mehr Sichtbarkeit aufgenommen. Was war das Verzeichnis für Ihr SYSTEM-Konto? Ich habe einige Vorschläge gemacht, aber ich bin mir nicht sicher über den genauen Standort. – VonC

+0

Nach diesem Aufruf: 'System.out.println (System.getProperty (" user.home "));' das Standard-Home-Systemverzeichnis für Windows7 (und vermutlich jedes andere NT-basierte Windows-System) ist einfach 'C : \\ ' – StormeHawke