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

时间:2014-05-12 09:49:22

标签: jgit

在GitHub项目中,当我们进入任何分支页面时,我们可以看到描述提前/后分支w.r.t的数字的图形。主

我们如何使用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));
  }
}

2 个答案:

答案 0 :(得分: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();
    }
  }

答案 1 :(得分:1)

您的代码对我来说很好,我把它的一部分添加到jgit-cookbook中作为样本添加它以查看它是否有效。在本地,当远程存储库存在实际差异时,我会看到计数。

请注意BranchTrackingStatus如何工作:它不会执行远程请求并从远程端获取最新提交,但它只会显示本地git存储库在远程跟踪分支上与本地分支相比的含义。

即。您可能需要首先在远程端具有更新的存储库上执行git fetch,以便更新远程存储库的状态,然后只有BranchTrackingStatus才会显示值。