在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)
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)