2012-12-07 16 views
5

Próbuję użyć NGit do połączenia z Github (tj. Za pomocą klucza prywatnego, a także hasła).NGit nawiązywanie połączenia z plikiem klucza prywatnego

Czy ktoś może mnie przez to przejść?

mojego normalnego pobrać byłoby:

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

w jaki sposób mogę to zrobić za pomocą klucza prywatnego?

Odpowiedz

4

Po długiej bitwie, wielu wyszukiwaniach Google dla przykładów Jgit i znacznie więcej bólu, znalazłem rozwiązanie!

Zasadniczo przesłonić i SessionFactory z własną rękę i wstrzyknąć swój certyfikat na czas połączenia:

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

a następnie zastosować ją tak:

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

Szybka wskazówka: Jeśli masz zmienną środowiskową GIT_SSH set, Jsch użyje tego zamiast używać skonfigurowanego JschConfigSessionFactory podczas inicjowania połączenia SSH. W moim przypadku będzie to wywoływanie TortoisePlink.exe. –

+0

Jeśli utworzysz kolejne pytanie dotyczące zmiennej env GIT_SSH dla NGit, mam odpowiedź - poza zasięgiem tego pytania. – Doug

Powiązane problemy