gpt4 book ai didi

java - 查找 2 个 git 提交之间可用的分支

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:13 25 4
gpt4 key购买 nike

我有一个开始提交,我想从中找到所有分支,直到到达另一个分支时找不到该提交的注释。

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

在这种情况下,假设提交 1-5 中的所有提交都有注释“查找分支”并且提交 6 没有具有该值的 not。

所以我将从提交1开始找到所有父级(即:提交2)并尝试检查此提交是否有分支(即:子级数量大于1)。如果有超过 1 个 child

  1. getChildren() 方法仅适用于 PlotCommit 对象,而 parentCommit.getParents() 方法仅返回 RevCommit 对象。
  2. 我想找到特定提交中存在的分支名称

然后,当提交上不再有注释时(即提交 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 的分支名称

最佳答案

虽然这种请求的 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 ”。
即使对于本地提交:想象一下您已经 merge 了 feature分支回到master 。然后此命令还将报告 master分支机构和所有feature merge 后创建的分支。
Git 根本不存储在哪个分支上创建的修订。

After these warnings: a rough implementation of "git branch --contains " could look like this:

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

关于java - 查找 2 个 git 提交之间可用的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14052124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com