2013-06-20 3 views
1

일부 테스트 커밋 (모두 기본 분기)이있는 리포지토리가 있습니다. 명령을 로그 JGit 사용 , 나는이가 (exemple를 위해) 커밋 볼 수 있습니다Jgit RevWalk.parseCommit() throw MissingObjectException

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); 

예외 :

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) 
이 조각의

내가 뭘 잘못하고 있니? 저장소의 솔루션 초기화가 액세스 부분에 잘못

..

+0

API 사용이 올바른 것으로 보입니다. 'repository'와'git.getRepository()'가 같은 저장소입니까? 이 코드를 어떻게 실행합니까? 이전 코드에서 생성 한 저장소입니까? (커밋 시간 때문에 커밋 ID가 다를 수 있습니다)? – robinst

+0

나는 저장소와 git.getRepository()를 시도했지만 변화가 없었다. 리포지토리는 예전의 코드 예에 의해 생성되지만 실제 시나리오에서는 매번 git log 명령에서 커밋 ID를 가져오고 생성과 액세스 간에는 변경하지 않아야합니다. : s –

+0

github에서 직접 복제 한 저장소이고 동일한 문제가 발생합니다. git log를 사용하고 하나의 커밋 ID를 "임의로"가져 와서 이후에 액세스하려고하면이 org.eclipse.jgit.errors.MissingObjectException이 발생합니다. .. –

답변

0

이 좋아 내 실수는 .. 저장소의 초기화는 (대신 루트의 서브 디렉토리)에서 나중에 액세스 틀렸다. 하지만 다른 오류를 예상했을 것이다 .. 여기

문제를 보여주는 미리보기 :

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); 
     } 
    } 

저장소가 잘못 (두 번째 부분에) 초기화 이후 문제가 해결되지해야하지만 오류가해야 알려주십시오. :/