如何使用带有 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 密钥