7

ソース管理に 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()メソッド呼び出しで失敗しますが、次の例外があります。

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)

私がこれを読んだ方法では、 で私のknown_hostsファイルが見つからないようですuser_home/.git。しかし、私は 1 時間検索してきましたが、既知のホスト ファイルを探す場所を JSch に指示するように JGit を構成する方法が見つかりません。

提案?オリジンのエントリが known_hosts ファイルに存在することを知っています

4

1 に答える 1

9

この回答は次のとおりです。

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

ただし、jsch (Java セキュア シェル)を直接使用するのではなく 、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);

それを見つけた!

これは に由来しJschConfigSessionFactory.java#knownHosts()、次のようになります。

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

userHomeSystem.getProperty("user.home")に基づいています。

そのため、Java セッションに がuser.home定義されていること、および%USERPROFILE%/.ssh/known_hostsそこにファイルがあることを確認してください。

( Windows の場合、つまり、Windows を使用している場合は、user.homejava によって設定する必要があります。場合によっては、これが常に機能するとは限りません)。%USERPROFILE%


をお持ちの場合%USERPROFILE%/.ssh/known_hostsここで述べたように

ssh(コマンドラインツールを使用して)クライアントに SSH 接続するだけで、 ~/.ssh/known_hosts file.


この場合、StormeHawkeはコメントで次のように述べています。

これをTomcatでWindowsサービスとして実行しているため、Jsch(および拡張子JGit)はユーザーフォルダーではなく、フォルダーのSYSTEMアカウントのホームフォルダーを探していました.ssh
この場合、Tomcat は開発とテストの目的でのみ私のマシンで実行されるため、.sshフォルダをホーム フォルダにコピーしただけです (おそらく最適なセキュリティ ポリシーではありませんが、この場合のリスクは最小限です)。SYSTEM

this questionthis oneから、 LocalSystem アカウントのディレクトリは次のようになります。

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

OPは次のよ​​うに言及しています:

この呼び出しによると:

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

SYSTEMWindows7 (およびおそらくその他の NT ベースの Windows システム)のデフォルトのC:\ホーム ディレクトリは単純に.
(理想的ではありませんが、迅速な修正のために機能します)。

于 2013-04-06T10:43:04.370 に答える