2014-09-20 322 views
5

我想通过ssh用java克隆一个git项目。我有一个git-shell用户的用户名和密码作为凭据。我可以使用以下命令在终端中克隆项目,没有问题。 (当然,它要求输入密码第一)用ssh用用户名和密码克隆git仓库

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

然而,当我使用JGIT API

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

试试下面的代码我

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

我应该怎么办?有任何想法吗? (我正在使用OSX 10.9.4和JDK 1.8)

+0

如果您想使用用户名和密码作为凭证提供程序,那么您可能会使用'http'作为git repo URI。 – 2014-09-20 19:08:23

+0

用户名和密码用于Ubuntu服务器上的ssh用户。 – 2014-09-20 19:33:03

+0

也许与jgit.transport.SshConfigSessionFactory有关的内容??? – 2014-09-20 19:36:02

回答

5

对于SSH认证,JGit使用JSch。 JSch提供​​来创建和部署SSH连接。告诉JGit应该使用哪个SSH会话工厂的最快方法是通过SshSessionFactory.setInstance()在全局范围内进行设置。

JGit提供了一个抽象JschConfigSessionFactory,其configure方法可以被覆盖,以提供密码:

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

要设置​​以更明智的方式是稍微复杂。 CloneCommand - 像所有可能打开连接的JGit命令类 - 从TransportCommand继承。该类有一个setTransportConfigCallback()方法,该方法也可用于为实际命令指定SSH会话工厂。

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我已经使用您的代码片段增强了答案,并且我建议将问题还原为其原始格式以保留问答字符。其他人会发现_best_答案是第一个答案(而且未来可能与我的答案不同)。 – 2014-09-21 10:56:37

+0

为了在Eclipse中编译这段代码,我不得不包含jsch.jar(用于com.jcraft.jsch.Session)但是这次当我运行程序(这是一个依赖于jgit插件的Eclipse插件)时,我得到了以下错误。 java.lang.LinkageError:加载器约束违例:加载器先前启动的加载名称为“com/jcraft/jsch/Session”的不同类型任何想法? – 2014-09-29 12:16:14

+0

难道这与[bug 420903](https://bugs.eclipse.org/bugs/show_bug.cgi?id=420903)有关?否则,我建议发布一个单独的问题,并提供有关JGit版本,JSch版本,您的捆绑软件清单等的更多详细信息。 – 2014-09-29 13:06:11