2013-04-26 3 views
1

개인 키와의 세션 부분 연결에는 문제가 없습니다. 그러나 내가 git Clone을 할 때 'Auth Fail'오류가 발생합니다. 어떻게 묶어서 묶고, 연결된 세션을 git clone과 함께 작동시킬 수 있습니까? .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

Credentials Provider에 도움이되는지 확인하기 위해 추가했습니다. CloneCommand clone = Git.CloneRepository() .SetCredentialsProvider (새 CustomCredentialsProvider()) .SetURI (gitAddress) .SetDirectory (folderToSave); clone.Call(); – Gavin

+0

어떤 버전의 NGit를 사용하고 있습니까? 내가 알아챈 한 가지는 NuGet에서 얻은 NGit이 꽤 오래되었습니다 (2011 년 이전). 따라서이 문제를 해결하는 버그 수정에 뒤처질 수 있습니다. 내 경우에는 전혀 연결할 수 없었지만 NGit의 최신 버전을 [github from latest] (https://github.com/mono/ngit)로 업데이트했습니다. –

답변

1

문제는 여기에 세션 객체가 실제로 언제든지 CloneCommand와 연결되지 않은 것입니다. 따라서 CloneCommand가 기본 세션 항목을 사용하여 자체 세션을 만들므로 세션을 설정하기 위해 수행 한 모든 작업은 실제로 아무 것도하지 않습니다.

복제 명령은 실제로 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); 
    } 
} 

이 그럼 당신은 모든 새로운 힘내들이 세션을 사용하고자 할 때이 공장을 사용하는 명령을 설정할 수 있습니다 : 나는 아래 일 것 같은 첫째, 당신은 SSHSessionFactory 추상 클래스를 구현하는 클래스를 작성해야합니다 : 나는 여전히이 라이브러리를 파악하고있어, 그래서 최적의 방법으로 MySSHSessionFactory를 작성하지 않은 수

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

// Now you can do a clone command. 

주 (이것은 예를 들어, 폐 세션에 대한 내결함성을 어떻게 처리합니까?). 그러나 적어도 이것은 시작입니다.

+0

고마워, 여기에 또 다른 예가있다.이 팁을 사용하여 http : // goo라는 "ssh : //"git 저장소 URL 양식 (http 프록시를 통한 jgit ssh)과 함께 JGit을 사용하면서 http 프록시 설정을 활성화한다. gl/SVqQ5l – boly38