问题定义

在上篇中提到通过 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