Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jgit RevWalk.parseCommit()抛出MissingObject异常_Java_Git_Jgit - Fatal编程技术网

Java Jgit RevWalk.parseCommit()抛出MissingObject异常

Java Jgit RevWalk.parseCommit()抛出MissingObject异常,java,git,jgit,Java,Git,Jgit,我有一个带有一些测试提交(都在默认分支上)的存储库。 使用JGit log命令,我可以看到以下提交(例如): 结果: commit: commit f34a848371ff334b2e85aa16fbf9b871d028b443 1371652639 ----sp commit: commit 33603f8c1c47712d45eb0db4b1827bbd113c2428 1371652639 ----sp commit: commit d52bd5c768263a957d99975f5482

我有一个带有一些测试提交(都在默认分支上)的存储库。 使用JGit log命令,我可以看到以下提交(例如):

结果:

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);
例外情况:

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)
我做错了什么

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

好的,我的错误。。 存储库的Init对于后续访问是错误的(一个子目录而不是根目录)。 但我本以为会有另一个错误

下面是一个显示问题的片段:

    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);
        }
    }
String wpath=“/tmp/test git”;
ArrayList提交=新建ArrayList();
//获取提交列表
{
File gitDir=新文件(wpath);
RepositoryBuilder=新的RepositoryBuilder();
Repository Repository=builder.setWorkTree(gitDir)
.readEnvironment().findGitDir().build();
Git-Git=新的Git(存储库);
for(RevCommit提交:git.log().call()){
字符串cid=commit.getId().toString().split(“”[1];
添加(cid);
}
集合。洗牌(提交);
}
//随机存取
{
File gitDir=新文件(wpath+“/subdir”);
RepositoryBuilder=新的RepositoryBuilder();
Repository Repository=builder.setWorkTree(gitDir)
.readEnvironment().findGitDir().build();
for(字符串cid:commits){
RevCommit=CommitUtils.getCommit(存储库,cid);
assertEquals(commit.getId().toString().split(“”[1],cid));
}
}

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

您对API的使用似乎是正确的。您确定
repository
git.getRepository()
是同一个存储库吗?如何运行此代码,您正在处理的存储库是否由早期代码生成(在这种情况下,提交ID会因提交时间而不同)?我尝试了存储库和git.getRepository(),没有更改。存储库是由前面的代码生成的是,但在我的实际场景中,提交ID每次都从git log命令中获取,并且不应在生成和访问之间更改..:我也尝试过直接从github克隆存储库,我也遇到了同样的问题。。我使用git日志,“随机”获取一个提交id,然后尝试访问它,结果是org.eclipse.jgit.errors.MissingObjectException…请发布完整的源代码,以便可以复制。好吧,我的错误。。存储库的Init对于后续访问是错误的(一个子目录而不是根目录)。但我会预料到另一个错误It’谢谢你的帮助。
    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);
        }
    }