如何使用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
相关产品推荐
相关产品推荐

