关于git:Jgit-pull-or-push-remote-hung-up-unexpectedly-的解决

2次阅读

共计 2214 个字符,预计需要花费 6 分钟才能阅读完成。

问题定义

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

正文完
 0