JGit SSH验证

Java JGit Authentication JGit SSH验证机制

Posted by Perrone on August 1, 2017

简介

如果你想在一个 Java 程序中使用 Git ,有一个功能齐全的 Git 库,那就是 JGit 。 JGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用。 JGit 项目由 Eclipse 维护,它的主页在 http://www.eclipse.org/jgit 。

正文

使用JGit clone 仓库,有几种方式 这里表一下 SSH下的访问方式,「Talk is cheap. Show me the code」

  • 加入mvn依赖,这里安利一下 nutz 谁用谁知道
<!-- Core Library -->
<dependency>
    <groupId>org.eclipse.jgit</groupId>
    <artifactId>org.eclipse.jgit</artifactId>
    <version>4.8.0.201706111038-r</version>
</dependency>

<dependency>
    <groupId>org.nutz</groupId>
    <artifactId>nutz</artifactId>
    <version>1.r.61</version>
</dependency>
  • 核心代码

    public static SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(OpenSshConfig.Host host, Session session) {

        }

        @Override
        protected JSch createDefaultJSch(FS fs) throws JSchException {
            JSch defaultJSch = super.createDefaultJSch(fs);

            //首先移除全部的身份认证
            defaultJSch.removeAllIdentity();
            //直接加入私钥文件路径
            //defaultJSch.addIdentity(Disks.normalize("~/.ssh/id_rsa"));
            //或者读取私钥后加入
            defaultJSch.getIdentityRepository().add(Files.readBytes(Disks.normalize("~/.ssh/id_rsa")));

            return defaultJSch;
        }
    };

    public static TransportConfigCallback transportConfigCallback = new TransportConfigCallback() {
        @Override
        public void configure(Transport transport) {
            if (transport instanceof SshTransport) {
                SshTransport sshTransport = (SshTransport) transport;
                sshTransport.setSshSessionFactory(sshSessionFactory);
            }
        }
    };

    /**然后为所欲为 clone时*/
    String directory = "/home/perrone/jgit";
    String branch = "dev";
    String uri = "git@github.com:nutzam/nutz.git";
    try (Git git = Git.cloneRepository().setBranch(branch).setURI(uri).setTransportConfigCallback(transportConfigCallback).setDirectory(new File(directory)).call()) {
        return git.getRepository().getWorkTree();
    }

    /**pull 时*/
    String branch = "dev";
    PullResult pullResult = git.pull().setRemoteBranchName(branch).setTransportConfigCallback(transportConfigCallback).call();

资源列表