问题定义
在上篇中提到通过 Jgit 实现对公司git的操作,达成业务上的一些性能,最近在扩容和部署到新租户环境下时,局部机器遇到操作近程仓库时报会报 remote hung up unexpectedly。
通过一番面向互联网编程后,逐渐确认是因为服务器上仓库通过https 模式 clone 下来后被重置为 ssh 模式,目前还不确定是为什么这些机器会有这样的景象。具体报错信息如下:
org.eclipse.jgit.api.errors.TransportException: git@git.xxx.com:/xxxx.git: remote hung up unexpectedly at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:246) at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:266)............... 省略其余Caused by: org.eclipse.jgit.errors.TransportException: git@git.xxx.com:/xxxx.git: remote hung up unexpectedly at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:313) at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:153) at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:151) at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:103) at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1462) at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:235)
在于近程仓库做身份验证时模式无奈匹配。
问题解决
既然是被设置为 ssh 形式,应答形式有两种形式,办法一是将服务器上本地 git 仓库改为 https 模式,办法二是代码中做校验,依据仓库类型再抉择对应的认证形式。
办法一是批改确认clone形式为https,若git clone https导出还是不行,则暴力的形式是批改.git/config配置文件的URL,将ssh门路改为https,或者间接将账户明码配置到URL中(url = https://[git账户]:[git明码]@git.xxx.com/xxx/xxx.git),绕过身份验证。
办法二的两种认证形式在上一篇《Java通过JGit操作Git的应用办法》中有提到:
HTTP(S)账号+明码:
// 账号 + 明码UsernamePasswordCredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName-zhimaxingzhe", password);// 拉取近程更新 git.pull().setCredentialsProvider(provider).setRemoteBranchName(branchName).call();
SSH协定应用公钥认证:
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() { @Override protected void configure(OpenSshConfig.Host host, Session session) { session.setConfig("StrictHostKeyChecking", "no"); } @Override protected JSch createDefaultJSch(FS fs) throws JSchException { JSch sch = super.createDefaultJSch(fs); //keyPath 公钥文件 path,执行ssh-keygen -o 命令生成,配置到账户信赖key中 sch.addIdentity(keyPath); return sch; }};// 关上本地仓库Git git = Git.open(new File("/Users/zhimaxingzhe/test"));// 执行近程拉取合并时应用git.pull().setTransportConfigCallback( transport -> { SshTransport sshTransport = ( SshTransport )transport; sshTransport.setSshSessionFactory( sshSessionFactory ); });
其实还有一种办法,我没有尝试,但看原文作者是解决了,这里贴出链接供参考https://juejin.cn/post/7132469765934678030
参考资料:
jgit-cookbook