持续创作,加速成长!这是我参与「掘金日新计划 · 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>
- 初始化仓库链接
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")为当前项目根目录。
- 使用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中查找