JGit 抛出 MissingObjectException 并说缺少未知的提交 ID

标签 jgit

我正在使用 JGit 提取两个提交之间的差异,但我经常遇到 JGit 抛出 MissingObjectException 并说缺少未知提交 ID 的问题,如下所示:

org.eclipse.jgit.errors.MissingObjectException: Missing unknown 9eae334e9492f55a841e6eb7ab302ff11d03ab21
    at org.eclipse.jgit.internal.storage.file.WindowCursor.open(WindowCursor.java:168)
    at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:236)
    at org.eclipse.jgit.revwalk.RevWalk.parseAny(RevWalk.java:890)
    at org.eclipse.jgit.revwalk.RevWalk.parseCommit(RevWalk.java:800)
    at collect.CollectTestcase.autoExtraction(CollectTestcase.java:99)*

运行代码时经常出现这种情况

RevWalk walk = new RevWalk(repo);
walk.parseCommit(commitId)

有人知道它出了什么问题吗?

最佳答案

如果存储库中没有具有给定 ID 的对象,JGit 将抛出一个 MissingObjectException

git 中有不同类型的对象,常见的有提交、blob 和树。

RevWalk 提供 API 来搜索特定类型,例如 parseCommit,以及使用 parseAny 的任何类型的对象。您正在搜索提交的信息在途中丢失,导致错误消息中出现令人困惑的“未知”。它实际上应该显示为“缺少提交 abc...”。

但是尽管有令人不快的消息,但这意味着没有这样的提交。您正在传递不同类型的对象的 ID,例如树对象,或者根本没有这样的对象。您可以使用 parseAny 查看是否存在具有给定 ID 的对象。如果可以找到一个对象,使用返回的 RevObjectgetType 来找出它是哪种类型。

关于JGit 抛出 MissingObjectException 并说缺少未知的提交 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68097863/

相关文章:

java - 如何使用 JGIT 恢复到修订版

java - 如何使用JGit查找提交距离?

java - 如何在通过 JGit 克隆 repo 后释放文件系统锁

java - 使用 JGit 爬取 GitHub

jgit - 使用 JGit 显示没有父提交(第一次提交)的更改/差异

c# - 在 C# 上使用 SSH 进行 NGit(JGit 端口)身份验证

java - JGit 获取 pull 文件

jgit - 我如何使用 JGit 做 "git show sha1:file"

java - 在 JGit 中使用远程存储库

java - JGit:远程存储库的状态