JGIT:对log()的Iterable <revcommit>结果进行的第一次迭代将其清空

时间:2018-12-14 17:11:02

标签: git logging iterable jgit

我有一个非常令人困惑的问题: 我正在使用JGit,并且在检索git日志后,返回的结果Iterable如果被迭代将自动清空。

代码:

Iterable<RevCommit> gitLog = git.log()
                              .addRange(refFromID, refToID)
                              .setRevFilter(RevFilter.NO_MERGES)        
                              .call();
System.out.println("Size of Iterable:  " + Iterables.size(gitLog)); //triggers first iteration. Size is >0
System.out.println("Size of Iterable:  " + Iterables.size(gitLog)); //second iteration triggered. Size is now = 0

在这种情况下,Google没有帮助-到目前为止,我没有发现任何东西,也没有任何人遇到这个问题。

即使resetting the RevWalk也没有任何改变:

“一个RevWalk实例只能使用一次来生成结果。第二次运行需要创建一个新的RevWalk实例,或者在再次启动之前调用reset()。” [...]

“ reset():重置内部状态并允许再次使用此实例。” [...]

”提供的迭代器在此实例的配置所描述的RevCommits列表上。应用程序应限制自己使用提供的Iterator或next(),但切勿同时在同一RevWalk上使用两者。迭代器可以缓冲RevCommits,而next()不缓冲。”

1 个答案:

答案 0 :(得分:0)

我只能看到的所有示例都一次遍历该列表,例如jgit/api/CommitAndLogCommandTest.java

但是任何步行者都可以reset in its walk order进行特定的eclipse/jgit/revwalk/ObjectWalk.java#markStart"

因此,请尝试将您的列表重置为它的第一个元素,然后再调用第二个Iterables.size(gitLog)