2017-03-15 12 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.ALLListMode.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().getRef()を使用し、あなたは人跡未踏レフリーがまだあることが判明した場合FETCH_RESULTORIG_HEAD、などのような参考文献が含まrepo.getRefDatabase().getAdditionalRefs()からレフリーから開始点をマークすることもできます。あなたはのJava 8ストリームAPIソリューション見ることができます

1

:それはそれらの枝に最近のコミットを、すべての枝を反復処理し、ピック

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()); 
     }); 

は、それが子孫順とピックの日付によってコミットのリストをソート最初の1つ。それはそれが出力をコンソールに出力しますが存在する場合、このような何か:もちろん

Wed Aug 30 09:49:42 CEST 2017: test file added (Szymon Stepniak) 

最後の動作がコミット存在は例示であり、それは簡単に任意の追加のビジネスロジックに置き換えることができます。私はそれが助けて欲しい

関連する問題