gpt4 book ai didi

java - 如何定义 "In between"JGit RevFilter?

转载 作者:行者123 更新时间:2023-11-30 02:57:58 25 4
gpt4 key购买 nike

我正在尝试实现一个通过 RevWalk#setRevFilter() 使用的 RevFilter。以下是我尝试过的:

private class InBetweenRevFilter extends RevFilter {

private AnyObjectId end;
private AnyObjectId begin;

public InBetweenRevFilter(AnyObjectId begin, AnyObjectId end) {
this.begin = begin;
this.end = end;
}

@Override
public RevFilter clone() {
return this;
}

@Override
public boolean include(RevWalk walker, RevCommit c)
throws StopWalkException, MissingObjectException,
IncorrectObjectTypeException, IOException {
RevCommit from = walker.parseCommit(begin);
RevCommit to = walker.parseCommit(end);
return (walker.isMergedInto(from, c) && walker.isMergedInto(c, to));
}
}

过滤器的结果应该是在begin之后和end之前推送的提交。问题是,当我设置此过滤器时,RevWalk.next() 仅返回用 RevWalk.markStart(RevCommit c) 标记为起点的提交。下面,我展示了我如何尝试使用过滤器:

    RevWalk walk = new RevWalk(getRepository());
RevCommit beginCommit = walk.parseCommit(getRepository().resolve(start));
RevCommit endCommit = walk.parseCommit(getRepository().resolve(end));
walk.setRevFilter(new InBetweenRevFilter(beginCommit.getId(), endCommit.getId()));
walk.markStart(endCommit);
for (RevCommit rev : walk) {
System.out.println(rev.getFullMessage());
}
walk.close();

在此示例中,控制台中仅打印来自 endCommit 的消息。还有其他方法可以做到这一点吗?或者,我错过了什么或做错了什么?

最佳答案

我刚刚在 jgit-cookbook 发布了一个片段这显示了一种方法:

基本上,您可以在一个提交处开始遍历,然后运行遍历,直到发现第二个提交或分支上的提交用完为止。

请注意,这里时间倒退,因为这就是 Git 存储提交之间链接的方式,即我们从较新的提交“to”开始,一直走到“from”。

        String from = "3408efc41a51555d488d30d8a91ea560c5e13311";
String to = "7228de6ebe2a3087118562414061af4e189624c0";

// a RevWalk allows to walk over commits based on some filtering that is defined
try (RevWalk walk = new RevWalk(repository)) {
RevCommit commit = walk.parseCommit(repository.resolve(to));

System.out.println("Walking all commits starting at " + to + " until we find " + from);
walk.markStart(commit);
int count = 0;
for (RevCommit rev : walk) {
System.out.println("Commit: " + rev);
count++;

if(rev.getId().getName().equals(from)) {
System.out.println("Found from, stopping walk");
break;
}
}
System.out.println(count);

walk.dispose();
}

关于java - 如何定义 "In between"JGit RevFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730329/

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