2012-12-07 23 views
5

Tôi đang cố gắng sử dụng NGit để kết nối với Github (tức là sử dụng khóa riêng cũng như mật khẩu).NGit tạo kết nối với một tệp khóa riêng

Ai đó có thể hướng dẫn tôi qua nó?

My bình thường lấy sẽ là:

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

thế nào tôi sẽ làm điều này với một khóa bí mật?

Trả lời

4

Sau một trận chiến dài, nhiều tìm kiếm google cho các ví dụ Jgit và nhiều nỗi đau khác, tôi đã tìm ra giải pháp!

Về cơ bản bạn ghi đè và SessionFactory với riêng bạn và tiêm chứng chỉ của bạn vào thời điểm kết nối:

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); 
    } 
} 

Và sau đó tiêm nó như vậy:

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

Mẹo: Nếu bạn có một biến môi trường GIT_SSH set, Jsch sẽ sử dụng nó thay vì sử dụng JschConfigSessionFactory được cấu hình khi khởi tạo kết nối SSH của nó. Trong trường hợp của tôi, nó sẽ gọi TortoisePlink.exe. –

+0

Nếu bạn tạo một câu hỏi khác về biến env GIT_SSH cho NGit, tôi có câu trả lời - nằm ngoài phạm vi cho câu hỏi này. – Doug

Các vấn đề liên quan