使用JGit获取存储库中的最新提交
我想使用JGit在存储库中获取最后的提交元数据(按日期最小的一个)。
我知道我可以使用提交元数据
try (RevWalk walk = new RevWalk(repository)) { RevCommit commit = walk.parseCommit(repository.resolve(commitHash)); }
但是如何获得最新的提交哈希?
有没有其他方法可以直接在存储库中获取最年轻的RevCommit
日期?
比较所有分支中最后提交的日期。 可以将ListMode.ALL
更改为ListMode.REMOTE
以仅比较远程分支。 或者……可以省略流畅的setter .setListMode(whatever)
从本地存储库中读取。
RevCommit youngestCommit = null; List branches = new Git(repository).branchList().setListMode(ListMode.ALL).call(); try(RevWalk walk = new RevWalk(git.getRepository())) { for(Ref branch : branches) { RevCommit commit = walk.parseCommit(branch.getObjectId()); if(commit.getAuthorIdent().getWhen().compareTo( youngestCommit.getAuthorIdent().getWhen()) > 0) youngestCommit = commit; } }
要在存储库中查找最新提交, RevWalk
配置为从所有已知引用开始,并按提交日期降序排序。 例如:
Repository repo = ... try( RevWalk revWalk = new RevWalk( repo ) ) { revWalk.sort( RevSort.COMMIT_TIME_DESC ); Map allRefs = repo.getRefDatabase().getRefs( RefDatabase.ALL ); for( Ref ref : allRefs.values() ) { RevCommit commit = revWalk.parseCommit( ref.getLeaf().getObjectId() ); revWalk.markStart( commit ); } RevCommit newestCommit = revWalk.next(); }
根据您的使用情况,您可能还希望从repo.getRefDatabase().getAdditionalRefs()
refs中标记起点repo.getRefDatabase().getAdditionalRefs()
包括像FETCH_RESULT
, ORIG_HEAD
等的FETCH_RESULT
。如果您发现仍有未跟踪的引用,请使用repo.getRefDatabase().getRef()
。
您可以在下面找到Java 8 Stream API解决方案:
final List branches = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call(); final RevWalk revWalk = new RevWalk(git.getRepository()); branches.stream() .map(branch -> { try { return revWalk.parseCommit(branch.getObjectId()); } catch (IOException e) { throw new RuntimeException(e); } }) .sorted(Comparator.comparing((RevCommit commit) -> commit.getAuthorIdent().getWhen()).reversed()) .findFirst() .ifPresent(commit -> { System.out.printf("%s: %s (%s)%n", commit.getAuthorIdent().getWhen(), commit.getShortMessage(), commit.getAuthorIdent().getName()); });
它遍历所有分支并在这些分支中选择最近的提交,然后按照后代顺序按日期排序提交列表并选择第一个。 如果它存在,它打印到控制台输出如下:
Wed Aug 30 09:49:42 CEST 2017: test file added (Szymon Stepniak)
当然,最后一次提交存在的行为是示例性的,并且可以很容易地用任何其他业务逻辑替换。 我希望它有所帮助。