在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));
}
}
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);
}
}
你的代码在我看来很好,我取了一些,并把它作为一个样本加到了 jgit-cookbook 来看看是否有效。在本地我看到计数时,与远程转帖有实际差异。
请注意 BranchTrackingStatus 的工作方式。它不会进行远程请求,也不会从远程获取最新的提交,但它只会显示本地git仓库在远程跟踪分支上与本地分支的比较。
也就是说,你可能需要做一个 "远程请求"。git fetch 首先在远端有更新的仓库上进行更新,以获取远端仓库的更新状态,只有这样BranchTrackingStatus才会显示值。