java工具箱-jgit

426 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

jgit简介

jgit是eclipse旗下java操作jgit的工具包,操作功能基本都支持。最新版是2022年9月发布的。git官方指引java调用git也是推荐的这个,可以说相当权威了。类似的工具还有gitblit这个提供了一个基础包及带web页面的解决方案,后面有空研究下。

代码

5.x是基于jdk.18编译的,6.x是基于jdk11,需要最新版本的话可以在maven仓库中查询,下面的例子还是从提交历史中过滤日志

Pom依赖

        <dependency>
          <groupId>org.eclipse.jgit</groupId>
          <artifactId>org.eclipse.jgit</artifactId>
          <version>5.13.0.202109080827-r</version>
        </dependency>
  1. 初始化仓库链接
        String projectDir = System.getProperty("user.dir");
        Git git = Git.open(new File(projectDir + "\\.git"));
        Repository repository = git.getRepository();

通过项目下的.git文件夹建立操作对象

这里的git类似于git命令,System.getProperty("user.dir")为当前项目根目录。

  1. 使用git.log()获取提交记录
        RevFilter messageRevFilter = MessageRevFilter.create("关键字");
        Iterable<RevCommit> all = git.log().setRevFilter(messageRevFilter).call();
        for (RevCommit revCommit : all) {
            log.info("提交备注:{}",revCommit.getFullMessage());
            log.info("提交文件列表-----------------");
            try(TreeWalk tw = new TreeWalk(repository)){
                tw.setRecursive(true);
                tw.addTree(revCommit.getTree());
                while (tw.next()) {
                    int similarParents = 0;
                    for (int i = 1; i < tw.getTreeCount(); i++) {
                        if (tw.getFileMode(i) == tw.getFileMode(0) && tw.getObjectId(0).equals(tw.getObjectId(i))) {
                            similarParents++;
                        }
                        if (similarParents == 0) {
                            log.info("提交文件:{}",tw.getPathString());
                        }
                    }
                }
            }
        }

这里的git类似于命令行操作,RevFilter为日志过滤器这里使用的是提交记录的过滤,当然也可以不指定。

  • MessageRevFilter:提交备注过滤
  • CommitterRevFilter:提交人名称过滤
  • AuthorRevFilter:作者名称过滤 jgit里每次提交都是一个tree,需要使用TreeWalk来解析,tree中包含很多内容,similarParents是用于过滤未修改的文件。

上面只展示了文字记录相关的过滤器还有很多其它类型的可在org.eclipse.jgit.revwalk.filter中查找

参考资料

www.eclipse.org/jgit/

wiki.eclipse.org/JGit/User_G…

www.git-scm.com/book/zh/v2/…