作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个通过 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/
我正在尝试实现一个通过 RevWalk#setRevFilter() 使用的 RevFilter。以下是我尝试过的: private class InBetweenRevFilter extends
我是一名优秀的程序员,十分优秀!