使用JGit确定前后的提交次数

Gau*_*ary 3 jgit

在GitHub项目上,当我们转到任何分支页面时,我们都可以看到描述分支wrt master前面/后面编号的图形。

我们如何使用JGit确定数字后面的那些?

BranchTrackingStatus为此使用了类,但是我得到的BranchTrackingStatus对象始终为null。

这是我使用的代码

private static Lis<Integer> getCounts(Repository repository, String branchName) throws IOException{
  BranchTrackingStatus trackingStatus = BranchTrackingStatus.of(repository, branchName);
  List<Integer> counts = new ArrayList<Integer>();
  if (trackingStatus != null){
      counts.add(trackingStatus.getAheadCount());
      counts.add(trackingStatus.getBehindCount());
  } else {
      counts.add(0);
      counts.add(0);
  }
  return counts;
}

public void show(String repoName, String baseBranchName) throws IOException, GitAPIException{    

  Repository repository = repoManager.openRepository(new Project.NameKey(repoName));

  List<Ref> call = new Git(repository).branchList().call();
  for (Ref ref : call) {
    List<Integer> counts = getCounts(repository, ref.getName());
    System.out.println("Commits ahead : "+counts.get(0));
    System.out.println("Commits behind : "+counts.get(1));
  }
}
Run Code Online (Sandbox Code Playgroud)

Rüd*_*ann 5

BranchTrackingStatus.of()假定branchName以全名(例如refs / heads / master)或短名(例如master)表示本地分支。它返回null如果给定branchName无法找到或跟踪分支未配置或不存在。

要比较两个任意分支,可以采用如下BranchTrackingStatus代码:

  void calculateDivergence( Ref local, Ref tracking ) throws IOException {
    RevWalk walk = new RevWalk( repository );
    try {
      RevCommit localCommit = walk.parseCommit( local.getObjectId() );
      RevCommit trackingCommit = walk.parseCommit( tracking.getObjectId() );
      walk.setRevFilter( RevFilter.MERGE_BASE );
      walk.markStart( localCommit );
      walk.markStart( trackingCommit );
      RevCommit mergeBase = walk.next();
      walk.reset();
      walk.setRevFilter( RevFilter.ALL );
      aheadCount = RevWalkUtils.count( walk, localCommit, mergeBase );
      behindCount = RevWalkUtils.count( walk, trackingCommit, mergeBase );
    } finally {
      walk.dispose();
    }
  }
Run Code Online (Sandbox Code Playgroud)