JGit SSH密钥 clone/pull/log操作

不多说了,copy的累死我了,真心不好找 -_-

JGit 通过SSH私钥文件clone/pull代码

1.目的及准备工作

# 目的:通过jgit框架通过SSH密钥文件来连接git仓库并clone代码到本地

# 准备工作:
    1.需要一个私钥文件,比如C:\Users\xxx\.ssh\id_rsa这个文件,如果是ppk文件(putty生成的用来验证git仓库权限的文件),则找到 puttygen.exe,双击运行后,点击Conversions->import Key(导入ppk文件)->Save private key(保存为一个无后缀名的文件)
    2.项目引入Jgit依赖
        <dependency>
             <groupId>org.eclipse.jgit</groupId>
             <artifactId>org.eclipse.jgit</artifactId>
             <version>3.7.0.201502260915-r</version>
        </dependency>

2.通过java代码进行clone

package com.jgittest.util;

import java.io.File;

import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshSessionFactory;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.util.FS;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

/**
 * git操作工具类
 * @author houjiayin.co
 *
 */
public class GitUtil {
    
    public static void main(String[] args) {
        String localCodeDir = "H:/myGitRepository"; //本地文件夹
        String remoteRepoPath = "ssh://***"; //git地址
        String keyPath = "H:/private_key"  //私钥文件
        gitClone(remoteRepoPath, localCodeDir,keyPath);
        
    }
    
    //localRepoPath 为本地文件夹
    //keyPath 私钥文件 path
    //remoteRepoPath 为 ssh git远端仓库地址
    protected static void gitClone(String remoteRepoPath, String localRepoPath,String keyPath) {
        //ssh session的工厂,用来创建密匙连接
        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);
                sch.addIdentity(keyPath); //添加私钥文件
                return sch;
            }
          };

        //克隆代码库命令
        CloneCommand cloneCommand = Git.cloneRepository();
        Git git = null;
        try {
            git = cloneCommand.setURI(remoteRepoPath) //设置远程URI
                .setTransportConfigCallback(transport -> {
                    SshTransport sshTransport = ( SshTransport )transport;
                    sshTransport.setSshSessionFactory( sshSessionFactory );
                })
                .setDirectory(new File(localRepoPath)) //设置下载存放路径
                .call();
            System.out.println("success");
        } catch (Exception e) {
            System.out.println("fail");
            e.printStackTrace();
        } finally {
            if (git != null) {
                git.close();
            }
        }
    }
    

3. pull代码

//localRepoPath 为 .git 的 path 如 : D:\\gitRepository\\.git
//keyPath 私钥文件 path
public static void pullCode(String remoteRepoPath, String localRepoPath, String keyPath) {
        System.out.println("===" + remoteRepoPath + "===" + localRepoPath + "===" + keyPath);
        //ssh session的工厂,用来创建密匙连接
        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);
                sch.addIdentity(keyPath);
                return sch;
            }
        };
        try {
            //关联到本地仓库
            FileRepository fileRepository = new FileRepository(new File(localRepoPath));
            Git pullGit = new Git(fileRepository);
            //设置密钥,拉取文件
            PullCommand pullCommand = pullGit
                    .pull()
                    .setTransportConfigCallback(
                            transport -> {
                                SshTransport sshTransport = ( SshTransport )transport;
                                sshTransport.setSshSessionFactory( sshSessionFactory );
                            });
            pullCommand.call();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

JGit 获取提交信息/详细提交日志

1.提交信息

//此方法获取了仓库内(path下,有可能为仓库下子文件夹)的所有提交版本号
public static List<String> getGitVersions(String path) {
    List<String> versions = new ArrayList<>();
     try {
        Git git = Git.open(new File(path));
        Repository repository = git.getRepository();
        Git git1 = new Git(repository);
         Iterable<RevCommit> commits = git.log().all().call();
         int count = 0;
         for (RevCommit commit : commits) {
             System.out.println("LogCommit: " + commit);
             System.out.println("===" + commit.getFullMessage());
             String version = commit.getName(); //版本号,用来查询详细信息
             versions.add(version);
             System.out.println("===" + commit.getName());
             System.out.println("===" + commit.getAuthorIdent());                
             count++;
         }
         return versions;
     }catch (Exception e) {
        e.printStackTrace();
     }
    return null;
 }

2. 获取提交的详细信息

/**
 * 获取两个版本间提交详细记录
 * @param path
 */
//version 为 上一个方法查询出来的版本号
public static void showDiff(String path,String oldVersion,String newVersion) {
    try {
        Git git = Git.open(new File(path));
        Repository repository = git.getRepository();
        //旧版本
        AbstractTreeIterator oldTreeParser = prepareTreeParser(repository, oldVersion);
        //新版本
        AbstractTreeIterator newTreeParser = prepareTreeParser(repository, newVersion);
        
        List<DiffEntry> diff = git.diff().
                setOldTree(oldTreeParser).
                setNewTree(newTreeParser).
                call();
        for (DiffEntry entry : diff) {
            System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
            //此处可传一个输出流获取提交详情
            DiffFormatter formatter = new DiffFormatter(System.out);
            formatter.setRepository(repository);
            formatter.format(entry);
        }
        
    }catch (Exception e) {
        e.printStackTrace();
    }
}

附几个有用的 jgit 资料地址

# git官网对jgit的介绍
https://git-scm.com/book/zh/v2/%E9%99%84%E5%BD%95-B%3A-%E5%9C%A8%E4%BD%A0%E7%9A%84%E5%BA%94%E7%94%A8%E4%B8%AD%E5%B5%8C%E5%85%A5-Git-JGit

# jgit超有用的各种demo地址
https://github.com/centic9/jgit-cookbook 

# 一些常用的jgit方法
https://my.oschina.net/u/4339481/blog/4748737
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容