对于某些用例,您可以从Java应用程序访问git存储库。 JGit提供了与构建器模式API的有用集成。 Git客户端可以使用SSH密钥进行身份验证。
要打开一个Git仓库,请调用cloneRepository()
命令。
File workingDir = Files.createTempDirectory("workspace").toFile();
TransportConfigCallback transportConfigCallback = new SshTransportConfigCallback();
git = Git.cloneRepository()
.setDirectory(workingDir)
.setTransportConfigCallback(transportConfigCallback)
.setURI("ssh://example.com/repo.git")
.call();
我们自己的transport config回调实现实现了用于访问存储库的SSH通信的配置。 我们想告诉JGit使用SSH通信,而忽略主机密钥检查。
private static class SshTransportConfigCallback implements TransportConfigCallback {
private final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
}
};
@Override
public void configure(Transport transport) {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(sshSessionFactory);
}
}
默认情况下,它将使用id_rsa
密钥文件,该文件位于~/.ssh
。 如果要指定其他文件位置或配置由密码保护的密钥,请同时更改Java安全通道的创建。
private static class SshTransportConfigCallback implements TransportConfigCallback {
private final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch jSch = super.createDefaultJSch(fs);
jSch.addIdentity("/path/to/key", "super-secret-passphrase".getBytes());
return jSch;
}
};
@Override
public void configure(Transport transport) {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(sshSessionFactory);
}
}
现在,您可以在Git
句柄上发出命令。 有关如何访问Git存储库的完整示例,请参见我的AsciiBlog应用程序。
翻译自: https://www.javacodegeeks.com/2017/12/access-git-repositories-java-using-ssh-keys.html