java - Jgit RevWalk.parseCommit() 抛出 MissingObjectException

标签 java git jgit

我有一个包含一些测试提交的存储库(全部位于默认分支上)。 使用 JGit log 命令,我可以看到这些提交(例如):

RepositoryBuilder builder = new RepositoryBuilder();
Repository repository = builder.setWorkTree("/tmp/myworkingdir").readEnvironment().findGitDir().build();
Git git = new Git(repository);

for (RevCommit commit : git.log().call()) {
    System.out.println("commit: " + commit.getId());
}

结果:

commit: commit f34a848371ff334b2e85aa16fbf9b871d028b443 1371652639 ----sp
commit: commit 33603f8c1c47712d45eb0db4b1827bbd113c2428 1371652639 ----sp
commit: commit d52bd5c768263a957d99975f5482020ffc3434d5 1371652639 ----sp

但是当我尝试从字符串 SHA1 获取 RevCommit 时,它在此代码段的最后一行失败:

ObjectId revid = repository.resolve("33603f8c1c47712d45eb0db4b1827bbd113c2428");
RevWalk revWalk = new RevWalk(repository);
RevCommit commit = revWalk.parseCommit(revid);

异常(exception):

org.eclipse.jgit.errors.MissingObjectException: Missing unknown 33603f8c1c47712d45eb0db4b1827bbd113c2428
at org.eclipse.jgit.storage.file.WindowCursor.open(WindowCursor.java:126)
at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:229)
at org.eclipse.jgit.revwalk.RevWalk.parseAny(RevWalk.java:817)
at org.eclipse.jgit.revwalk.RevWalk.parseCommit(RevWalk.java:730)

我做错了什么?

解决方案 存储库的初始化在访问部分出错..

最佳答案

好吧,我的错误.. 存储库的初始化对于随后的访问是错误的(子目录而不是根目录)。 但我预计会出现另一个错误..

这里是显示问题的片段:

    String wpath = "/tmp/test-git";
    ArrayList<String> commits = new ArrayList<String>();

    // get list of commit
    {
        File gitDir = new File(wpath);
        RepositoryBuilder builder = new RepositoryBuilder();
        Repository repository = builder.setWorkTree(gitDir)
                .readEnvironment().findGitDir().build();
        Git git = new Git(repository);

        for (RevCommit commit : git.log().call()) {
            String cid = commit.getId().toString().split(" ")[1];
            commits.add(cid);
        }
        Collections.shuffle(commits);
    }

    // Random access
    {
        File gitDir = new File(wpath + "/subdir");
        RepositoryBuilder builder = new RepositoryBuilder();
        Repository repository = builder.setWorkTree(gitDir)
                .readEnvironment().findGitDir().build();

        for (String cid : commits) {
            RevCommit commit = CommitUtils.getCommit(repository, cid);
            assertEquals(commit.getId().toString().split(" ")[1], cid);
        }
    }

它不应该工作,因为存储库被错误地初始化(在第二部分),但错误应该告诉它..:/

关于java - Jgit RevWalk.parseCommit() 抛出 MissingObjectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208655/

相关文章:

java - 如何在具有给定 Activity 参数的静态方法中使用父类(super class)?

linux - SSH 进入 EC2 并且无法执行 git clone 命令

git - 我怎样才能看到我之前在哪个分支

multithreading - JGit:是否有线程安全的方式来添加和更新文件

jgit - 如何使用 JGit 记录两个发布标签之间的提交

git - 如何打印所有的 git commit 消息?

按钮的 JavaFX 条件 CSS 样式

java - 客户端使用 httprequest 检查新数据是否可用

java - 使用savedInstanceState保存 fragment 状态

git - 我克隆了一个 git 存储库。我如何从它 pull 到工作目录?