2013-04-05 16 views
5

Korzystając z jgit z gitolitem do kontroli kodu źródłowego, mam aplikację, która generuje pewien kod na komendzie i którą chcemy zatwierdzić do kontroli źródła. Celem jest szybkie przewinięcie do przodu, zatwierdzenie nowego kodu, a następnie wciśnięcie go.Konfigurowanie znanych_hostów w jgit

Mam następujący sposób:

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

Ta metoda nie działa na wezwanie pull.call() metodzie, z następującym wyjątkiem:

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) 

Sposób czytam to wydaje się, że to nie jest znalezienie mój plik known_hosts w user_home/.git. Jednak szukałem przez godzinę i nie znajduję sposobu, aby skonfigurować JGit, aby powiedzieć JSchowi, gdzie szukać pliku known_hosts.

Sugestie? Wiem, że wpis dotyczący pochodzenia jest obecny w pliku moi known_hosts

Odpowiedz

7

This answer wspomina:

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

Ale używasz jgit i niejsch (the Java secure shell) bezpośrednio, więc zobaczmy:

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

Znaleziono!

ten pochodzi z JschConfigSessionFactory.java#knownHosts() i wygląda następująco:

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

userHome opiera się na System.getProperty("user.home").

Upewnij się, że sesja Java ma numer user.home defined i że masz tam plik %USERPROFILE%/.ssh/known_hosts.

(user.home powinien być ustawiony przez java na %USERPROFILE% dla systemu Windows, to znaczy, jeśli jesteś w systemie Windows: w niektórych przypadkach this won't always work).


Teraz jeśli zrobić mają %USERPROFILE%/.ssh/known_hosts, a następnie, jak mentioned here

Tylko ssh do klienta (za pomocą wiersza polecenia ssh narzędzie), to doda wpis do ~/.ssh/known_hosts file.


W tym przypadku StormeHawke wspomina w the comments:

ponieważ biegnę to w Tomcat jako usługa systemu Windows, jsch (a co za tym idzie JGit) był nie patrząc w folderze użytkownika, ale w folderze domowym klienta w folderze .
W tym przypadku po prostu skopiowałem folder .ssh do katalogu domowego SYSTEM, ponieważ Tomcat działa tylko na moim komputerze do celów programistycznych i testowych (prawdopodobnie nie jest to najlepsza polityka bezpieczeństwa, ale ryzyko jest w tym przypadku minimalne).

Od this question, this one, że katalog dla LocalSystem Account powinno być:

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

PO wspomina:

Według tej rozmowy:

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

domyślny SYSTEM hom Katalog e dla Windows7 (i prawdopodobnie dowolnego innego systemu Windows opartego na NT) jest po prostu C:\.
(więc nie jest idealny, ale dla szybkiej naprawy działa).

+0

Ty, panie, jesteś geniuszem. Uderzyłem głową o ścianę, próbując dojść do tego, dlaczego nie rozpoznałem wpisu known_hosts, gdy nagle uświadomiłem sobie, że skoro używam tego w Tomcat jako usługa Windows, Jsch (i przez JGit) to nie znajduje się w folderze _my_ użytkownika, ale w folderze domowym konta _SYSTEM_ dla folderu .ssh. W tym przypadku posunąłem się naprzód i właśnie skopiowałem folder .ssh do folderu domowego SYSTEM, ponieważ Tomcat działa tylko na moim komputerze do celów programistycznych i testowych (prawdopodobnie nie jest to najlepsza polityka bezpieczeństwa, ale ryzyko jest w tym przypadku minimalne). Dzięki! – StormeHawke

+0

@StormeHawke Excellent! Włączyłem Twój komentarz w odpowiedzi, aby uzyskać lepszą widoczność. Jaki był katalog twojego konta SYSTEM? Podałem kilka sugestii, ale nie jestem pewien dokładnej lokalizacji. – VonC

+0

Zgodnie z tym wezwaniem: 'System.out.println (System.getProperty (" user.home "));' domyślny katalog domowy SYSTEM dla Windows7 (i prawdopodobnie dowolnego innego systemu Windows opartego na systemie NT) to po prostu 'C : \\ ' – StormeHawke