簡體   English   中英

使用 JGit 獲取存儲庫中的最新提交

[英]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_RESULTORIG_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM