2012-09-19 253 views
8

我試圖用jgit的API使用下面的代碼你如何設置jschconfigsessionfactory的配置jgit使拉和推工作?

org.eclipse.jgit.api.Git.open(theRepoFile).pull().call() 

做一個git推/拉,但我得到的例外

JSchException Auth fail 
com.jcraft.jsch.Session.connect (Session.java:461) 
org.eclipse.jgit.transport.JschConfigSessionFactory.getSession (JschConfigSessionFactory.java:116) 
org.eclipse.jgit.transport.SshTransport.getSession (SshTransport.java:121) 
org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init> (TransportGitSsh.java:306) 
org.eclipse.jgit.transport.TransportGitSsh.openPush (TransportGitSsh.java:152) 
org.eclipse.jgit.transport.PushProcess.execute (PushProcess.java:130) 
org.eclipse.jgit.transport.Transport.push (Transport.java:1127) 
org.eclipse.jgit.api.PushCommand.call (PushCommand.java:153) 

即使使用CGT文件的拉動和推動工作。

我嘗試了檢查示例代碼

Java git client using jgit

但上述問題並不提供什麼必要做一個git與通過SSH正常驗證的遠程回購拉一個完整的編碼範例鍵。應該有一種方式來獲得從~/.ssh/或憑證信息窗口等效。

回答

3

問題是Jsch不支持ssh-agent開箱即用。你需要配置https://github.com/ymnk/jsch-agent-proxy才能使其工作。

另一種方法是使自己的org.eclipse.jgit.transport.CredentialsProvider,並設置org.eclipse.jgit.transport.CredentialItem正確的值(由用戶請求他們或查找一個文件)。您可以更改默認CredentialsProviderorg.eclipse.jgit.transport.CredentialsProvider/setDefault

見我的Clojure庫DJ的詳細信息:https://github.com/bmillare/dj/blob/library/src/dj/git.clj

+0

所以你試試看,它的工作?你能否更詳細地描述它,到底要做什麼?將代理整合到代碼中?這將有助於下一個開發者有這個問題。 – Vince

+0

我其實並沒有使用jsch-agent-proxy,我做了我自己的CredentialsProvider,要求用戶輸入密碼。它實際上是用clojure寫成的,但細節就在那裏。 https://github.com/bmillare/dj/blob/library/src/dj/git.clj – bmillare

-1

我依稀記得掌握JSch是阻止我一會兒,因爲日誌不是很明確的一個錯誤。我不能肯定地告訴它是相同的問題,但我跟着這個頁面來解決我的問題:

https://help.github.com/articles/generating-ssh-keys

(到一個錯誤的網絡配置是由於)

+0

您發佈的鏈接沒有任何特定的jgit。我說我能夠使用普通的git,這意味着ssh密鑰很好。一種可能是我使用gentoo keychain工具,這可能是jgit不知道如何處理的東西。 – bmillare

+0

如果你不想聽別人說什麼,不要問。 「因爲日誌不是很明確」可能不夠明確:我失去了工作的日子只有看在同一個方向,你做的,使用Git完美的工作。我不知道我的回答是值得,因爲它是一個模糊的記憶,但如果你不嘗試,至少你確定它不會工作任何好轉。事實上,如果你找到一個寫有jGit和ssh配置的頁面,並且隨意發佈它,這與jGit buit無關,這裏的目標是下一個讀者找到有用的信息。 – Vince

+0

哦和整體,你會隨着時間學習,但是Git是怪異的用途比jGit方式更加寬容。 – Vince

11

Jsch會自動檢測你的SSH密鑰,但如果這些受密碼保護將會失敗。您需要通過如下所示的CredentialsProvider指定密碼:

JschConfigSessionFactory sessionFactory = new JschConfigSessionFactory() { 
@Override 
protected void configure(OpenSshConfig.Host hc, Session session) { 
    CredentialsProvider provider = new CredentialsProvider() { 
     @Override 
     public boolean isInteractive() { 
      return false; 
     } 

     @Override 
     public boolean supports(CredentialItem... items) { 
      return true; 
     } 

     @Override 
     public boolean get(URIish uri, CredentialItem... items) throws UnsupportedCredentialItem { 
      for (CredentialItem item : items) { 
       ((CredentialItem.StringType) item).setValue("yourpassphrase"); 
      } 
      return true; 
     } 
    }; 
    UserInfo userInfo = new CredentialsProviderUserInfo(session, provider); 
    session.setUserInfo(userInfo); 
} 
}; 
SshSessionFactory.setInstance(sessionFactory); 
+0

非常感謝您爲此 - 我一直在爲JGit的SSH身份驗證工作苦苦掙扎,發現這一點,並立即解決了我的問題。非常感謝。 –

+0

@JoPintoPaul:我試着用類似的代碼片段來做這件事。可以請幫忙。我的問題是:https://stackoverflow.com/questions/45889326/userauth-fail-using-jgit-to-access-git-repo-securely-for-pullcommand – mohanjot