我使用jGit遍历存储库中的提交。当我单独使用RevWalk
类时,我会回到存储库中的所有提交。但是当我使用revWalk.setFilter()
添加过滤器时,我不再获得任何提交,即使我确信存在符合我的过滤条件的提交。
这是我的代码:
RevWalk walk = new RevWalk(repo);
// These two lines give me trouble:
// RevFilter filter = CommitTimeRevFilter.between(sinceDate, untilDate);
// walk.setRevFilter(filter);
Ref head = repo.getRef("refs/heads/master");
RevCommit headCommit = walk.parseCommit(head.getObjectId());
// omitting some exception handling for conciseness
walk.markStart(headCommit);
List<MyCommitPOCO> commits = new LinkedList<>();
for(RevCommit commit : walk) {
MyCommitPOCO processedCommit = processRevCommit(commit);
commits.add(processedCommit);
}
walk.dispose();
return commits;
当我运行此代码而没有顶部注释掉的两行时,for循环迭代walk
提交处理我的存储库中的每次提交,这是我所期望的。但是,当我使用RevFilter
取消注释行时,for循环不会迭代甚至单个提交,这对我来说似乎并不合适。我已经尝试使用sinceDate
和untilDate
的多个值来运行程序,我知道这些值适用于我尝试使用的存储库,但没有尝试过我和#39已经成功了。
为什么我的RevWalk
让我在使用RevFilter
时对任何提交进行迭代?当我取消注释时导致问题的两行代码出了什么问题?
答案 0 :(得分:0)
我发现CommitTimeRevFilter
按预期工作。您是否已调试代码以查看所需的提交是否到达过滤器代码?
以下是可作为起点的测试。它执行四次提交,时间戳为1,2,3,4秒,然后使用带有时间过滤器的RevWalk来收集第二个和第二个之间的时间戳:
public class RevWalkFilterLearningTest {
@Rule
public final TemporaryFolder tempFolder = new TemporaryFolder();
private Git git;
@Test
public void testTimeFilter() throws Exception {
commit( 1000 );
commit( 2000 );
commit( 3000 );
commit( 4000 );
RevWalk revWalk = new RevWalk( git.getRepository() );
RevFilter filter = CommitTimeRevFilter.between( new Date( 2000 ), new Date( 3000 ) );
revWalk.setRevFilter( filter );
Ref headRef = git.getRepository().getRef( Constants.HEAD );
RevCommit headCommit = revWalk.parseCommit( headRef.getObjectId() );
revWalk.markStart( headCommit );
int count = 0;
for( RevCommit revCommit : revWalk ) {
count++;
}
assertEquals( 2, count );
}
private void commit( int time ) throws Exception {
PersonIdent committer = new PersonIdent( "committer", "committer@example.com" );
git.commit().setCommitter( new PersonIdent( committer, new Date( time ) ) ).setMessage( "msg" ).call();
}
@Before
public void setUp() throws GitAPIException {
git = Git.init().setDirectory( tempFolder.getRoot() ).call();
}
@After
public void tearDown() {
git.close();
}
}