2012-12-07 24 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

相关问题