2012-12-07 25 views
5

我想用NGit連接到Github(即使用私鑰和密碼)。NGit使私鑰文件連接

有人可以通過它走過我嗎?

我的正常抓取是:

  var git = Git.CloneRepository() 
      .SetDirectory(_properties.OutputPath) 
      .SetURI(_properties.SourceUrlPath) 
      .SetBranchesToClone(new Collection<string>() { "master" }) 
      .SetCredentialsProvider(new UsernamePasswordCredentialsProvider("username","password")) 
      .SetTimeout(3600) 
      .Call(); 

我會怎麼做這個用私鑰?

回答

4

經過長時間的戰鬥,許多谷歌搜索Jgit的例子和更多的痛苦,我找到了解決方案!

基本上你重寫和SessionFactory的用自己的,並在連接時注入您的證書:

public class CustomConfigSessionFactory : JschConfigSessionFactory 
{ 
    public string PrivateKey { get; set; } 
    public string PublicKey { get; set; } 

    protected override void Configure(OpenSshConfig.Host hc, Session session) 
    { 
     var config = new Properties(); 
     config["StrictHostKeyChecking"] = "no"; 
     config["PreferredAuthentications"] = "publickey"; 
     session.SetConfig(config); 

     var jsch = this.GetJSch(hc, FS.DETECTED); 
     jsch.AddIdentity("KeyPair", Encoding.UTF8.GetBytes(PrivateKey), Encoding.UTF8.GetBytes(PublicKey), null); 
    } 
} 

然後注入它像這樣:

var customConfigSessionFactory = new CustomConfigSessionFactory(); 
customConfigSessionFactory.PrivateKey = properties.PrivateKey; 
customConfigSessionFactory.PublicKey = properties.PublicKey; 

NGit.Transport.JschConfigSessionFactory.SetInstance(customConfigSessionFactory); 

var git = Git.CloneRepository() 
      .SetDirectory(properties.OutputPath) 
      .SetURI(properties.SourceUrlPath) 
      .SetBranchesToClone(new Collection<string>() { "master" }) 
      .Call(); 
+1

快速提示:如果你有一個GIT_SSH環境變量Jsch將在初始化其SSH連接時使用它,而不是使用配置的JschConfigSessionFactory。在我的情況下,它會調用TortoisePlink.exe。 –

+0

如果您爲NGIT創建了另一個關於GIT_SSH env變量的問題,我有答案 - 儘管這個問題超出了範圍。 – Doug