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

问题描述 投票:4回答:2

在GitHub项目中,当我们进入任何一个分支页面时,我们可以看到描述一个分支与master之间的提交超前数的图表。

我们如何使用JGit确定这些超前数?

我使用了 BranchTrackingStatus 类,但我得到 BranchTrackingStatus 对象总是空的。

以下是我使用的代码

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));
  }
}
jgit
2个回答
6
投票

BranchTrackingStatus.of() 假设 branchName 表示一个当地分支机构,可以用全名(如......)或简称(如......)表示。refs/heads/master)或其简称(如 master). 它返回 null 如果给定 branchName 找不到,或者跟踪分支没有配置或不存在。

要比较两个任意分支,你可以采用 BranchTrackingStatus 这样的代码。

void calculateDivergence(Ref local, Ref tracking) throws IOException {
  try (RevWalk walk = new RevWalk(repository)) {
    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);
  }
}

2
投票

你的代码在我看来很好,我取了一些,并把它作为一个样本加到了 jgit-cookbook 来看看是否有效。在本地我看到计数时,与远程转帖有实际差异。

请注意 BranchTrackingStatus 的工作方式。它不会进行远程请求,也不会从远程获取最新的提交,但它只会显示本地git仓库在远程跟踪分支上与本地分支的比较。

也就是说,你可能需要做一个 "远程请求"。git fetch 首先在远端有更新的仓库上进行更新,以获取远端仓库的更新状态,只有这样BranchTrackingStatus才会显示值。

© www.soinside.com 2019 - 2024. All rights reserved.