Java 在jgit中配置已知的_主机

Java 在jgit中配置已知的_主机,java,git,ssh,jsch,jgit,Java,Git,Ssh,Jsch,Jgit,使用jgit和gitolite进行源代码控制,我有一个应用程序,可以根据命令生成某些代码,我们希望将其提交到源代码控制中。目标是快速推进,提交新代码,然后推动它 我有以下方法: private void commitToGitRepository(String updateComment, Config config) throws IOException, NoFilepatternException, GitAPIException { if(git == null)

使用jgit和gitolite进行源代码控制,我有一个应用程序,可以根据命令生成某些代码,我们希望将其提交到源代码控制中。目标是快速推进,提交新代码,然后推动它

我有以下方法:

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();
}
此方法在
pull.call()
method调用时失败,但出现以下异常:

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)
com.jcraft.jsch.JSchException:UnknownHostKey:www.somehost.com。RSA密钥指纹是9d:92:a9:c5:5d:cb:5f:dc:57:ff:38:7e:34:31:fe:75
位于com.jcraft.jsch.Session.checkHost(Session.java:748)
位于com.jcraft.jsch.Session.connect(Session.java:319)
位于org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:116)
位于org.eclipse.jgit.transport.sshttransport.getSession(sshttransport.java:121)
位于org.eclipse.jgit.transport.TransportGitsh$SshFetchConnection。(transportGitsh.java:248)
位于org.eclipse.jgit.transport.transportGitsh.openFetch(transportGitsh.java:147)
位于org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
位于org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
位于org.eclipse.jgit.transport.transport.fetch(transport.java:1104)
位于org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)
位于org.eclipse.jgit.api.PullCommand.call(PullCommand.java:245)
位于net.intellidata.dpu.controller.schema.EntityMappingController.commitToGitRepository(EntityMappingController.java:149)
... (在符合我的代码的地方截断)
按照我的阅读方式,它似乎没有在
user\u home/.git
中找到我的已知\u hosts文件。然而,我已经搜索了一个小时,没有找到一种方法来配置JGit,告诉JSch在哪里查找已知的_hosts文件

建议?我知道源代码的条目存在于我的已知主机文件中

提到:

jsch.setKnownHosts("C:\\Users\\aUsername\\known_hosts");
但是您正在使用jgit,而不是直接使用,所以让我们看看:

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);
找到了

这来自,看起来像:

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

因此,请确保您的java会话有一个,并且其中有一个
%USERPROFILE%/.ssh/known_hosts
文件

user.home
应该由java为Windows设置为
%USERPROFILE%
,也就是说,如果您在Windows上:在某些情况下,)


现在,如果您确实有一个
%USERPROFILE%/.ssh/known_hosts
,那么

只需SSH到客户端(使用命令行
SSH
工具),这将向
~/.SSH/known_hosts文件添加条目


在这种情况下,中提到:

由于我在Tomcat中作为windows服务运行此服务,因此Jsch(扩展为JGit)不是在我的用户文件夹中,而是在
系统的
帐户主文件夹中查找
.ssh
文件夹。
在本例中,我继续将
.ssh
文件夹复制到
SYSTEM
主文件夹中,因为Tomcat仅在我的机器上运行用于开发和测试目的(可能不是最好的安全策略,但在本例中风险最小)

从中,的目录应为:

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

jsch.setKnownHosts("C:\\Users\\aUsername\\known_hosts");
根据这一呼吁:

 System.out.println(System.getProperty("user.home")); 
Windows7(以及任何其他基于NT的Windows系统)的默认
系统
主目录只是
C:\


(虽然不太理想,但为了快速解决问题,它很有效)。

先生,你是个天才。当我突然意识到,由于我在Tomcat中以windows服务的形式运行此服务,Jsch(扩展为JGit)不是在我的用户文件夹中查找,而是在系统帐户的主文件夹中查找.ssh文件夹时,我一直在拼命想弄清楚为什么它不能识别已知的_hosts条目。在本例中,我继续将.ssh文件夹复制到SYSTEM home文件夹中,因为Tomcat仅在我的机器上运行用于开发和测试目的(可能不是最好的安全策略,但在本例中风险最小)。谢谢@斯托梅霍克棒极了!我已将您的评论包含在答案中,以提高可视性。您的系统帐户的目录是什么?我提出了一些建议,但我不确定确切的位置。根据这个调用:
System.out.println(System.getProperty(“user.home”)
Windows7(可能还有其他任何基于NT的Windows系统)的默认系统主目录只是'C:\`@StormeHawke ok,因此您只需复制'C:`中的
.ssh
目录,就可以了?正确。我不建议将此解决方案用于生产环境,因为C:\并不是一个完全“安全”的位置。如果这是一个生产服务器,我会按照您的建议将系统变量设置为set user.home