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