2014-09-20 16 views
5

Próbuję sklonować projekt git z Javą przez ssh. Mam nazwę użytkownika i hasło użytkownika powłoki git jako poświadczenia. Mogę sklonować projekt w terminalu za pomocą następującego polecenia bez problemu. (Oczywiście, to prosi o hasło pierwszy)Sklonuj repozytorium git przez ssh z nazwą użytkownika i hasłem Java

git clone [email protected]:/path/Example.git 

Jednak kiedy próbuję następujący kod przy użyciu JGIT api

File localPath = new File("TempProject"); 
Git.cloneRepository() 
    .setURI("ssh://HOST/path/example.git") 
    .setDirectory(localPath) 
    .setCredentialsProvider(new UsernamePasswordCredentialsProvider("***", "***")) 
    .call(); 

mam

Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: ssh://HOST/path/example.git: Auth fail 

Co należy zrobić? Jakieś pomysły? (Używam OSX 10.9.4 i JDK 1.8)

+0

Prawdopodobnie możesz używać 'http' dla identyfikatora URI git repo, jeśli chcesz używać nazwy użytkownika i hasła jako dostawcy referencji. –

+0

nazwa użytkownika i hasło są dla użytkownika ssh na serwerze Ubuntu. –

+0

Może coś związanego z jgit.transport.SshConfigSessionFactory ??? –

Odpowiedz

5

Do uwierzytelniania z SSH, JGit używa JSch. JSch zapewnia SshSessionFactory do tworzenia i udostępniania połączeń SSH. Najszybszym sposobem poinformowania JGit o tym, która z fabryk sesji SSH ma być używana, jest ustawienie go globalnie poprzez SshSessionFactory.setInstance().

JGit zapewnia abstrakcyjne JschConfigSessionFactory, którego configure metoda może być zmienione, aby podać hasło:

SshSessionFactory.setInstance(new JschConfigSessionFactory() { 
    @Override 
    protected void configure(Host host, Session session) { 
     session.setPassword("password"); 
    } 
}); 
Git.cloneRepository() 
    .setURI("ssh://[email protected]/path/repo.git") 
    .setDirectory("/path/to/local/repo") 
    .call(); 

Aby ustawić SshSessionFactory w bardziej rozsądny sposób jest nieco bardziej skomplikowana. CloneCommand - podobnie jak wszystkie klasy poleceń JGit, które mogą otwierać połączenie - dziedziczy po TransportCommand. Ta klasa ma metodę setTransportConfigCallback(), która może być również używana do określenia fabryki sesji SSH dla rzeczywistego polecenia.

CloneCommand cloneCommand = Git.cloneRepository(); 
cloneCommand.setTransportConfigCallback(new TransportConfigCallback() { 
    @Override 
    public void configure(Transport transport) { 
    if(transport instanceof SshTransport) { 
     SshTransport sshTransport = (SshTransport)transport; 
     sshTransport.setSshSessionFactory(...); 
    } 
    } 
}); 
+0

@NuriTasdemir Poprawiłem odpowiedź za pomocą fragmentu kodu i zalecam, aby przywrócić pytanie do pierwotnej postaci, aby zachować znak pytania i odpowiedzi. Inni znajdą odpowiedź _best_ jako pierwszą (która może być inna niż moja w przyszłości). –

+0

Aby skompilować ten kod w Eclipse musiałem dołączyć jsch.jar (dla com.jcraft.jsch.Session) Jednak tym razem, kiedy uruchomiłem program (który jest wtyczką Eclipse, która zależy od wtyczki jgit), mam następujący błąd. java.lang.LinkageError: naruszenie ograniczenia programu ładującego: program ładujący wcześniej zainicjował ładowanie dla innego typu o nazwie "com/jcraft/jsch/Session" Jakieś pomysły? –

+0

Czy to możliwe, że jest to związane z [bug 420903] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=420903)? W przeciwnym razie polecam opublikować osobne pytanie i podać więcej szczegółów na temat wersji JGit, wersji JSch, manifestu pakietu itp. –