如何使用带有 ssh 的 java api 推送到 gitlab

Posted

技术标签:

【中文标题】如何使用带有 ssh 的 java api 推送到 gitlab【英文标题】:How to push to gitlab with java api with ssh 【发布时间】:2017-11-04 21:43:43 【问题描述】:

我使用的是 GitLab Community Edition 9.1.1 d3123f6 版本的 gitlab。

我可以使用 http 协议将我的代码推送到 gitlab,但是当我尝试使用 git 协议时,它会显示以下错误。

Exception in thread "main" 
org.eclipse.jgit.errors.UnsupportedCredentialItem: 
ssh://git@192......: 
org.eclipse.jgit.transport.CredentialItem$YesNoType:The authenticity 
of host '192......' can't be established.

RSA key fingerprint is 
99:...............
Are you sure you want to continue connecting?
at org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider.get(UsernamePasswordCredentialsProvider.java:119)
at org.eclipse.jgit.transport.CredentialsProviderUserInfo.promptYesNo(CredentialsProviderUserInfo.java:124)
at com.jcraft.jsch.Session.checkHost(Session.java:785)
at com.jcraft.jsch.Session.connect(Session.java:342)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:117)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:137)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:264)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:162)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1201)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:203)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:136)
at org.dstadler.jgit.unfinished.PushToRemoteRepository.main(PushToRemoteRepository.java:100)

我的代码是

private static final String REMOTE_URL = "git@192.....:ash/test.git";
File localPath = new File("/home/user/Git", "");
localPath.getParentFile().mkdirs();
localPath.createNewFile();
if(!localPath.delete()) 
    throw new IOException("Could not delete temporary file " + localPath);


Git git = Git.cloneRepository()
        .setURI( REMOTE_URL )
        .setDirectory(localPath)
        .setCredentialsProvider( cp )
        .call();
System.out.println("Cloning from " + REMOTE_URL + " to " + localPath);


System.out.println("please edit the file and then press \"Enter\" here to push ");
System.in.read();


File file = new File( git.getRepository().getWorkTree(), "file" + new Object().hashCode() );

git.add().addFilepattern( file.getName() ).call();

git.commit().setAll(true).setMessage("a message").call();

git.push() .setCredentialsProvider( cp ) .call();

System.out.println("Pushed from repository: " + localPath + " to remote repository at " + REMOTE_URL);

【问题讨论】:

我认为 REMOTE_URL 不正确 但我从 gitlab 本身复制了它..我需要改变什么吗? @ArvindDhakad 我尝试添加 ssh://git@192.....NotSupportedException: URI not supported: ssh:///git@192 这不是有效的服务器 url 能否提供一个ssh url的例子 【参考方案1】:

先尝试从命令行建立连接:

ssh git@...

这应该问你同样的问题:回答“y”。

完成后,意味着一旦远程服务器的密钥扫描更新了~/.ssh/known_hosts,您可以再次尝试相同的 Java JGit 程序。

我在(5 年前)a solution, but for EGit, not JGit 之前发过帖子。

在“JGit Authentication Explained”查看更多信息

JGit 提供了一个抽象的 JSchConfigSessionFactory,它使用 JSch 建立 SSH 连接,并要求覆盖其 configure()

OP Ash 加上in the comments:

问题出在.ssh/config 文件中,其中注释了所需的行,包括私钥身份。

【讨论】:

我尝试了相同的步骤仍然显示相同的错误,我的代码看起来像这样private static final String REMOTE_URL = "git@192.16...1..1..:ashwath/test.git"; static SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() @Override protected void configure( Host host, Session session ) // do nothing ; public static void main(String[] args) throws IOException, GitAPIException UsernamePasswordCredentialsProvider cp = new UsernamePasswordCredentialsProvider("ashwath", "abcd"); CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setTransportConfigCallback(new TransportConfigCallback() @Override public void configure( Transport transport ) SshTransport sshTransport = ( SshTransport )transport; sshTransport.setSshSessionFactory( sshSessionFactory ); ); 我可以在命令提示符下做同样的事情,是的,它要求第一次输入是或否..我想知道可能是什么错误? @Ash 是的,ssh 命令要做的只是第一部分:ssh git@192...(没有:xxx):只做一次,更新known_hosts 文件。之后,只要你的 Java 程序使用相同的用户帐户执行,它就应该重用 known_hosts 中设置的信息。 @Ash 好的。我已将您的评论包含在答案中以提高知名度。

以上是关于如何使用带有 ssh 的 java api 推送到 gitlab的主要内容,如果未能解决你的问题,请参考以下文章

(git bash) 推送到 bitbucket 忽略 SSH 密钥

可以使用一个 SSH 密钥推送到不同的 Git 遥控器吗?

使用 ssh-key 无密码推送到 GitHub

如何使用 GitHub API v3 创建提交并推送到 repo?

如何将 Reactjs 日志和指标推送到 Grafana

Rails API 将 has_one: 图像从模型项推送到 Cloudinary 但不能