我有一个开始提交,我想找到所有分支,直到我到达另一个没有找到提交的注释。
commit 1
|
commit 2
| commit5
commit3 /
| /
commit 4
|
commit 6
在这种情况下说来自提交1-5的所有提交都有注释“find branch” 并且commit 6没有没有该值。
所以我将从commit 1开始查找所有父项(即:commit 2)并尝试检查是否存在此提交的分支(即:子项数超过1)。如果有超过1个孩子
getChildren()
方法仅适用于PlotCommit对象,但方法parentCommit.getParents()
仅返回RevCommit
对象。 然后当没有关于提交的注释(即提交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的分支名称
答案 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);