You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JGit获取指定日期区间内特定提交信息的提交记录

使用JGit筛选特定提交记录的正确姿势

你的这段代码并不完全正确,主要有几个问题:

  • addRange(start, end)是用来指定两个提交ID之间的范围,而非你需要的时间范围
  • start和end变量未初始化,直接调用会抛出空指针异常
  • 缺少提交信息的过滤逻辑,没法筛选出以[EA-开头的提交

下面一步步给你讲正确的实现方式:

1. 实现时间范围过滤

JGit的LogCommand提供了setSince()和setUntil()方法,对应Git命令里的--since和--until,你可以直接传入Date对象来指定时间范围:

// 构建起始时间:2018-01-24
Calendar startCal = Calendar.getInstance();
startCal.set(2018, Calendar.JANUARY, 24, 0, 0, 0);
Date sinceDate = startCal.getTime();

// 结束时间用当前时间
Date untilDate = new Date();

2. 实现提交信息过滤

要筛选以[EA-开头的提交,需要用CommitMessageRevFilter,它支持正则匹配:

// 匹配以"[EA-"开头的提交信息,注意正则转义
RevFilter messageFilter = CommitMessageRevFilter.create("^\\[EA-");

3. 关于addRange()的正确用法

如果你的需求里确实需要指定提交ID范围(而不是时间范围),才需要用addRange()。要获取ObjectId,可以通过仓库的resolve()方法,比如:

// 获取HEAD对应的提交ID
ObjectId headId = repo.resolve("HEAD");
// 获取某个分支的提交ID
ObjectId branchId = repo.resolve("develop");
// 获取某个提交哈希对应的ID
ObjectId commitId = repo.resolve("a1b2c3d");

然后把这两个ID传入addRange(startId, endId),它会返回这两个提交之间的所有提交(包括两端)。

完整示例代码

把这些逻辑整合起来,完整的代码应该是这样的:

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revfilter.CommitMessageRevFilter;
import org.eclipse.jgit.revfilter.RevFilter;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;

import java.io.File;
import java.util.Calendar;
import java.util.Date;

public class JGitLogExample {
    public static void main(String[] args) throws Exception {
        String path = "C:/path_to_repo";
        FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
        Repository repo = repositoryBuilder.setGitDir(new File(path, ".git")).findGitDir().build();
        Git git = new Git(repo);

        // 1. 设置时间范围
        Calendar startCal = Calendar.getInstance();
        startCal.set(2018, Calendar.JANUARY, 24, 0, 0, 0);
        Date sinceDate = startCal.getTime();
        Date untilDate = new Date();

        // 2. 设置提交信息过滤规则
        RevFilter messageFilter = CommitMessageRevFilter.create("^\\[EA-");

        // 3. 执行log命令,获取符合条件的提交
        Iterable<ObjectId> commits = git.log()
                .setSince(sinceDate)
                .setUntil(untilDate)
                .setFilter(messageFilter)
                // 如果需要指定提交ID范围,就加上下面这行,否则注释掉
                // .addRange(startCommitId, endCommitId)
                .call();

        // 遍历输出提交信息
        for (ObjectId commitId : commits) {
            System.out.println("提交ID: " + commitId.name());
            // 可以进一步获取提交的详细信息
            // RevCommit commit = repo.parseCommit(commitId);
            // System.out.println("提交信息: " + commit.getFullMessage());
        }

        git.close();
        repo.close();
    }
}

需要注意的点:

  • 正则表达式里的[是特殊字符,需要用\\转义,所以匹配开头的[EA-要写成^\\[EA-
  • 如果不需要提交ID范围,就不要调用addRange(),否则会和时间范围过滤叠加
  • 记得在使用完Git和Repository对象后关闭它们,避免资源泄漏

内容的提问来源于stack exchange,提问作者BlackForest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:43:11