2017-03-15 93 views
3

我想使用JGit獲取存儲庫中的最後一個提交元數據(最新的提交元數據)。使用JGit獲取存儲庫中的最新提交信息

我知道,我可以用

try (RevWalk walk = new RevWalk(repository)) { 
    RevCommit commit = walk.parseCommit(repository.resolve(commitHash)); 
} 

但如何獲得最新提交的哈希提交的元數據?

是否有任何其他方式直接在存儲庫中按日期獲得最年輕的RevCommit

+0

你能澄清一下_latest_的意思嗎?你是說按日期最小的?來自所有分支? –

+0

你的意思是'HEAD'最終指向的提交嗎? –

+0

是的確切地說,從所有分支按日期採集。爲所有分支尋找他是否很重要,因爲我認爲無論分支機構如何,我都可以相對於回購來尋找他? –

回答

1

比較所有分支中最後提交的日期。 ListMode.ALL可以更改爲ListMode.REMOTE以僅比較遠程分支。 或...流利的設置器.setListMode(whatever)可以省略從本地存儲庫中讀取。

RevCommit youngestCommit = null;  
List<Ref> 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; 
    } 
} 
+0

它會在整個回購中按照日期返回最年輕的提交,而不管分支是什麼? –

+0

不,它會返回'HEAD'指向的提交(通常是當前分支)。 –

+0

答案已更正。 –

2

要找到最新提交的倉庫內,配置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()包括像FETCH_RESULTORIG_HEAD,等裁判如果您發現仍有未追蹤裁判起點,用repo.getRefDatabase().getRef()

1

下面你可以找到一個的Java 8個流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) 

當然的行爲對最後提交的存在是示範性的,它可以與任何其他業務邏輯很容易地更換。我希望它有幫助。