什么是“git merge-base –fork-point branchA branchB”的jgit等价物

什么是“git merge-base –fork-point branchA branchB”的jgit等效代码?

我尝试了下面的代码,但我没有得到正确的答案。 我正在用它来寻找分支起源。 foreach.branch(git merge-base –fork-point mybranch theirbranch)将仅为起始点生成null提交ID。

所以,我需要做的就是弄清楚如何在jgit中执行此操作,并且我有一个计算分支原点的方法,当我还不知道它时。

private String getMergeBase(Repository repository, ObjectId commitIdA, ObjectId commitIdB) { RevWalk walk = new RevWalk(repository) try { RevCommit revA = walk.lookupCommit(commitIdA) RevCommit revB = walk.lookupCommit(commitIdB) walk.setRevFilter(RevFilter.MERGE_BASE) walk.markStart([revA,revB]) RevCommit mergeBase = walk.next() if (! mergeBase) { return null } return mergeBase.name } catch(Exception e) { project.logger.error("GetMergeBase Failed: ${commitIdA}, ${commitIdB} because ${e.message}") } return null } 

这是一种解决方法。 请注意,我正在使用Gradle / Groovy编写代码,因此代码可能看起来有点时髦。

  • getAll分支
  • 对于每个分支获得合并基础提交 – 因为所有来自master,所有人都会找到一个
  • 迭代提交并停止在合并基本列表中找到的第一个

`

 /** * Obtain GitWorkingCopyLog for all changes on branch with (svn --stop-on-copy equivalent) * @param repoDir * @return GitWorkingCopyLog */ private GitWorkingCopyLog getLogs(File repoDir) { List commits = [] Git git = openExistingRepository(repoDir) ObjectId head = getHead(git.repository) // tip of current branch // find common merge ancestor branch points for all branches List forkCandidates = mergeBaseForAllBranches(git, head) for (RevCommit r in git.log().call()) { if (r.name in forkCandidates) { break // stop looping on first rev in common merge base } commits.add(r) } return new GitWorkingCopyLog(git.repository, commits) } /** * Generate list of commit ids for merge base with all candidates. All branches come from master * so all branches share a common point of origin even if unrelated. * @param git jgit controller * @param head head revision for target branch * @return list of commit ids */ private ArrayList mergeBaseForAllBranches(Git git, ObjectId head) { def baseCandidates = [] getBranches(git).each { Ref other -> if (other.objectId != head) { String base = getMergeBase(git.repository, head, other.objectId) baseCandidates.add(base) } } baseCandidates } /** * * @param repository * @param commitIdA * @param commitIdB * @return divergence point between the two branches (even if seemingly unrelated all must come back to master) */ private String getMergeBase(Repository repository, ObjectId commitIdA, ObjectId commitIdB) { RevWalk walk = new RevWalk(repository) try { RevCommit revA = walk.lookupCommit(commitIdA) RevCommit revB = walk.lookupCommit(commitIdB) walk.setRevFilter(RevFilter.MERGE_BASE) walk.markStart(revA) walk.markStart(revB) RevCommit mergeBase = walk.next() println "\tA: ${revA.name}\n\tB: ${revB.name}\n\tM: ${mergeBase.name}" if (! mergeBase) { return null } return mergeBase.name } catch(Exception e) { project.logger.error("GetMergeBase Failed: ${commitIdA}, ${commitIdB} because ${e.message}") } return null } /** * Get Refs for all branches * @param git * @return Ref list */ private List getBranches(Git git) { List branchRefs = git.branchList().call() return branchRefs } `