找到2个git提交之间可用的分支

时间:2012-12-27 09:12:03

标签: java git egit jgit

我有一个开始提交,我想找到所有分支,直到我到达另一个没有找到提交的注释。

commit 1
|
commit 2
|         commit5
commit3  /
|       / 
commit 4
|
commit 6

在这种情况下说来自提交1-5的所有提交都有注释“find branch” 并且commit 6没有没有该值。

所以我将从commit 1开始查找所有父项(即:commit 2)并尝试检查是否存在此提交的分支(即:子项数超过1)。如果有超过1个孩子

  1. getChildren()方法仅适用于PlotCommit对象,但方法parentCommit.getParents()仅返回RevCommit对象。
  2. 我想找到特定提交中存在的分支名称
  3. 然后当没有关于提交的注释(即提交6没有注释)时,逻辑将停在那里并返回分支名称的集合

        Repository repo;//will be set as part of some other logic
        private Set findBranchesForCommit(PlotCommit parentCommit, String note) throws ExecutionException, MissingObjectException, IncorrectObjectTypeException, IOException {
            Set branches = new HashSet();
            PlotCommit[] parents = (PlotCommit[]) parentCommit.getParents();//XXX will throw exception as this return RevCommit[]
            for (int i = 0; i < parents .length; i++) {
                PlotCommit commit = parents[i];
                String result = extractExistingMessage(repo, "refs/notes", commit);//will return the if the note available for particular commit
                if (result.trim().length() > 0 && result.equalsIgnoreCase(note)) {
                    System.out.println("#########"+commit.getChildCount());
                    //TODO need to add logic to find the branch of the particular commit
                    branches.add(""); //add the branches available for the commit
                    branches.addAll(findBranchesForCommit(commit, note));
                }
            }
            return branches;
        }
    

    预期结果

    我想找到包含特定git音符的提交的分支名称。在上面的示例中,将返回Commit 1和commit 5的分支名称

1 个答案:

答案 0 :(得分:1)

虽然这种请求的git命令(查找给定提交的分支)是:

git branch --contains <commit>

(如“Git: Finding what branch a commit came from”和“How to list branches that contain a given commit?”)

它没有在JGit中实现。

This thread有此建议:

'git branch --contains <commit>'将报告包含此提交的每个分支 在报告的所有提交的标准推送/获取工作流中,仅报告“origin/master” 甚至对于本地提交:想象一下,您已将feature分支合并回master。然后,此命令还将报告合并后创建的master分支和所有feature分支 Git根本不存储修改它的分支。

  

在这些警告之后:“git branch --contains”的粗略实现可能如下所示:

Repository repo = new FileRepository(args[0]);
RevWalk walk = new RevWalk(repo);
RevCommit commit = walk.parseCommit(repo.resolve(args[1] + "^0"));
for (Map.Entry<String, Ref> e : repo.getAllRefs().entrySet())
  if (e.getKey().startsWith(Constants.R_HEADS))
    if (walk.isMergedInto(commit,
        walk.parseCommit(e.getValue().getObjectId())))
      System.out.println("Ref " + e.getValue().getName()
                                + " contains commit " + commit);