[英]Get the latest commit in a repository with JGit
我想使用 JGit 在存儲庫中獲取最后一個提交元數據(按日期計算最年輕的元數據)。
我知道我可以使用
try (RevWalk walk = new RevWalk(repository)) {
RevCommit commit = walk.parseCommit(repository.resolve(commitHash));
}
但是如何獲得最新的提交哈希?
有沒有其他方法可以直接在存儲庫中獲得最年輕的按日期RevCommit
?
您可以使用git log
並將其設置為僅返回最高的提交:
RevCommit latestCommit = new Git(repository).log().setMaxCount(1).call().iterator().next();
String latestCommitHash = latestCommit.getName();
按所有分支中上次提交的日期進行比較。 ListMode.ALL
可以更改為ListMode.REMOTE
以僅比較遠程分支。 或者...流暢的 setter .setListMode(whatever)
可以省略以從本地存儲庫中讀取。
RevCommit youngestCommit = null;
Git git = new Git(repository);
List<Ref> branches = git.branchList().setListMode(ListMode.ALL).call();
try {
RevWalk walk = new RevWalk(git.getRepository());
for(Ref branch : branches) {
RevCommit commit = walk.parseCommit(branch.getObjectId());
if(youngestCommit == null || commit.getAuthorIdent().getWhen().compareTo(
youngestCommit.getAuthorIdent().getWhen()) > 0)
youngestCommit = commit;
}
} catch (...)
要在存儲庫中查找最新提交, RevWalk
配置為從所有已知引用開始並按提交日期降序排序。 例如:
Repository repo = ...
try( RevWalk revWalk = new RevWalk( repo ) ) {
revWalk.sort( RevSort.COMMIT_TIME_DESC );
Map<String, Ref> 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 中標記起點,其中包括FETCH_RESULT
、 ORIG_HEAD
等 refs。 如果您發現仍有未跟蹤的 refs,請使用repo.getRefDatabase().getRef()
。
您可以在下面找到Java 8 Stream API解決方案:
final List<Ref> 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)
當然,上次提交時的行為是示范性的,可以很容易地替換為任何其他業務邏輯。 我希望它有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.