对于我当前的项目,我需要找出哪些用户上次修改了给定文件中的一系列行。为此,以及其他任务,我一直在使用JGit,并用Kotlin编写代码。到目前为止,我已经意识到,当我尝试使用JGit指责命令时,它会不断返回null,即使它没有抛出异常。这是我目前拥有的原型函数,它将在感兴趣的范围内逐行打印最后一封提交人的电子邮件(更不用说LocationInfo类了,它是一个自定义数据类,包含我想要检查的文件路径和范围(:
fun getContributors(location: LocationInfo, git: Git, commitID: ObjectId) {
val blamer = BlameCommand(git.repository)
blamer.setFilePath(location.path.substringAfter(git.repository.directory.parent))
blamer.setStartCommit(commitID)
val blameResult = blamer.call() // blameResult is always null!
println("Blaming: ${location.path.substringAfter(git.repository.directory.parent + "/")}")
for (line in location.range.start..location.range.end) {
println(blameResult.getSourceCommitter(line).emailAddress)
}
}
当我导航到终端中的存储库,签出一个旧的提交(与我的代码中的提交ID相同(,并在相同的文件上运行git责怪命令(与我代码中的路径相同(时,它确实做到了它应该做的事情,并为我提供了我需要的信息。这个问题的原因可能是什么?我确信我也为函数提供了合法的论据。我对BlameCommand的处理是否有误?
您可以将此命令的处理与org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BlameCommandTest.java
进行比较,如所示
BlameCommand command = new BlameCommand(db);
command.setFilePath("file.txt");
BlameResult lines = command.call();
因此,请确保location.path.substringAfter(git.repository.directory.parent)
实际引用的是一个文件,而不是文件夹。