使用Java通过ssh克隆git存储库并输入用户名和密码

6

我正在尝试通过Java over ssh克隆一个git项目。 我有一个git-shell用户的用户名和密码作为凭据。 我可以在终端中使用以下命令轻松克隆项目(当然,它会首先要求输入密码)。

git clone user@HOST:/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)


如果您想使用用户名和密码作为凭据提供程序,那么您可能可以使用 http 作为 git 存储库 URI。 - Wenbing Li
用户名和密码是用于Ubuntu服务器上的SSH用户。 - Nuri Tasdemir
也许与jgit.transport.SshConfigSessionFactory有关? - Nuri Tasdemir
1个回答

6

对于SSH身份验证,JGit使用JSch。 JSch提供了一个SshSessionFactory来创建和释放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://username@host/path/repo.git" )
  .setDirectory( "/path/to/local/repo" )
  .call();

以更为合理的方式设置SshSessionFactory略微复杂。 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( ... );
    }
  }
} );

@NuriTasdemir 我已经使用您的代码片段增强了答案,并建议将问题恢复到其原始形式以保留问答的特性。其他人将会把最佳答案作为第一个答案(这可能与我未来的答案不同)。 - Rüdiger Herrmann
为了在Eclipse中编译此代码,我必须包含jsch.jar(用于com.jcraft.jsch.Session)。但是这一次当我运行程序时(它是依赖于jgit插件的Eclipse插件),我遇到了以下错误。java.lang.LinkageError:加载器约束冲突:以前已启动加载名称为“com / jcraft / jsch / Session”的不同类型的加载器。有什么想法吗? - Nuri Tasdemir
这是否与bug 420903有关?否则,我建议您发布一个单独的问题,并提供有关JGit版本、JSch版本、您的捆绑清单等更多详细信息。 - Rüdiger Herrmann
我将其发布在http://stackoverflow.com/questions/26102649/java-lang-linkageerror-while-using-jgit-and-jsch-for-eclipse-plugin-development。 - Nuri Tasdemir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接