2013-04-26 184 views
1

會話部分與私鑰的連接沒有問題。但是,當我做一個git克隆,它會給出錯誤'驗證失敗'。如何包裝,綁定或使連接的會話與git克隆一起工作。我在.NET 4.0下使用NGIT,但不認爲這很重要,因爲JGIT幾乎是一樣的。NGIT/JGIT/Git#使用私鑰的SSH會話克隆GiT存儲庫

任何想法?這裏

感謝加文

 JSch jsch = new JSch(); 
     Session session = jsch.GetSession(gUser, gHost, 22); 
     jsch.AddIdentity(PrivateKeyFile); // If I leave this line out, the session fails to Auth. therefore it works. 
     Hashtable table = new Hashtable(); 
     table["StrictHostKeyChecking"] = "no"; // this works 
     session.SetConfig(table); 
     session.Connect(); // the session connects. 



     URIish u = new URIish(); 
     u.SetPort(22); 
     u.SetHost(gHost); 
     u.SetUser(gUser);    
     NGit.Transport.JschSession jschSession = new JschSession(session,u); 

     if (session.IsConnected()) 
     { 
      try 
      { 
       CloneCommand clone = Git.CloneRepository() 
        .SetURI(gitAddress) 
        .SetDirectory(folderToSave);           
       clone.Call();     

      // MessageBox.Show(Status, gitAddress, MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      catch (Exception ex) 
      { 
       // AUth Fail..... ???? 

      } 
     } 
     else 
     { 
      session.Disconnect(); 

     } 
     session.Disconnect(); 
+0

我在憑證提供程序中添加以查看它是否有幫助。 ()) CloneCommand clone = Git.CloneRepository() .SetCredentialsProvider(new CustomCredentialsProvider()) .SetURI(gitAddress) .SetDirectory(folderToSave); clone.Call(); – Gavin 2013-04-29 08:12:38

+0

您使用的是哪個版本的NGit?我注意到的一件事是,從NuGet獲得的NGit相當老舊(2011年),因此可能會在修復此問題的錯誤修復方面落後。就我而言,我根本無法連接,但隨後將我的NGit版本更新爲[最新來自github](https://github.com/mono/ngit)。 – 2013-11-30 07:38:03

回答

1

的問題是會話對象實際上並非在任何時候CloneCommand相關。因此,您爲完成會話所做的所有工作都沒有做任何事情,因爲CloneCommand將自己創建自己的會話(使用默認會話項目)。

克隆命令將從SSHSessionFactory獲得實際使用的會話。首先,你需要創建一個實現SSHSessionFactory抽象類的類,像我下面做:

public class MySSHSessionFactory : SshSessionFactory 
{ 
    private readonly JSch j; 

    public MySSHSessionFactory() 
    { 
     this.j = new JSch(); 
    } 

    public void Initialize() 
    { 
     this.j.SetKnownHosts(@"C:/known_hosts"); 
     this.j.AddIdentity(@"C:\id_rsa"); 
    } 

    public override RemoteSession GetSession(URIish uri, CredentialsProvider credentialsProvider, NGit.Util.FS fs, int tms) 
    { 
     var session = this.j.GetSession(uri.GetUser(), uri.GetHost()); 
     session.SetUserInfo(new MyUserInfo()); 
     session.Connect(); 

     return new JschSession(session, uri); 
    } 
} 

然後你就可以將所有新的Git命令使用此工廠時,他們希望使用一個會話:

var sessionFactory = new MySSHSessionFactory(); 
sessionFactory.Initialize(); 
SshSessionFactory.SetInstance(sessionFactory); 

// Now you can do a clone command. 

請注意,我仍然沒有搞清楚這個庫,所以我會以最佳的方式還沒有寫MySSHSessionFactory(它處理其關閉,例如會話容錯?)。但這至少是一個開始。

+0

感謝馬克,這裏是另一個例子下,我使用這個技巧來啓用一個http代理設置,同時使用JGit與「ssh://」git存儲庫url形式(通過http代理的jgit ssh)http:// goo。 GL/SVqQ5l – boly38 2013-12-04 16:53:43