2013-06-20 45 views
1

我有一個測試提交(所有默認分支)的存儲庫。 使用JGit登錄命令,我可以看到這些承諾(對於爲例):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日誌,採取一個提交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); 
     } 
    } 

它不應該工作,因爲存儲庫初始化錯誤(第二部分),但其誤差應告訴它..:/