2014-09-28 87 views
1

我正在嘗試將子模塊支持添加到project of mine,但我似乎無法使用JGit讀取特定的提交或記錄,而命令行git可以做到這一點,儘管分離首先說明子模塊在哪裏(就設計子模塊的工作而言)。JGit:從子模塊讀取提交

我有這樣的代碼,以「熔斷器人民軍」是子模塊:

FileRepositoryBuilder builder = new FileRepositoryBuilder(); 
    Repository repository = builder.setGitDir(new File("fuse-jna/.git")) 
     .readEnvironment() // scan environment GIT_* variables 
     .findGitDir() // scan up the file system tree 
     .build(); 

    ObjectId lastCommitId = repository.resolve("39c1c4b78ff751b0b9e28f4fb35148a1acd6646f"); 

    Iterable<RevCommit> commits = new Git(repository).log().add(lastCommitId).call(); 
    for(RevCommit commit : commits) { 
     System.out.println("Commit: " + commit.getId()); 
    } 

這個我得到:

org.eclipse.jgit.errors.MissingObjectException: Missing commit 39c1c4b78ff751b0b9e28f4fb35148a1acd6646f 
at org.eclipse.jgit.internal.storage.file.WindowCursor.open(WindowCursor.java:149) 
at org.eclipse.jgit.revwalk.RevWalk.getCachedBytes(RevWalk.java:883) 
at org.eclipse.jgit.revwalk.RevCommit.parseHeaders(RevCommit.java:145) 
at org.eclipse.jgit.revwalk.RevWalk.markStart(RevWalk.java:279) 
at org.eclipse.jgit.api.LogCommand.add(LogCommand.java:330) 
at org.eclipse.jgit.api.LogCommand.add(LogCommand.java:189) 
at org.dstadler.jgitfs.util.JGitHelperTest.testGitLinkRepository(JGitHelperTest.java:638) 

但是在命令行中的「保險絲南斯拉夫人民軍」目錄

git diff 39c1c4b78ff751b0b9e28f4fb35148a1acd6646f~ 

工作得很好,所以有可能這樣做。

有沒有其他方法如何與JGit做到這一點?或者是不完全支持子模塊呢?

+0

僅供參考,同樣使用內部的「git的/模塊/熔斷器JNA/git的」不工作。此外,「repository.getAllRefs()」也會返回一個空列表,所以在這裏根本找不到參考... – centic 2014-09-28 22:07:47

+0

我不知道JGit是如何工作的,但是關於子模塊,它們基本上都是自己的倉庫。在命令行中,當你在子模塊的目錄中時,你也只能看到他們的提交。使用JGit,你是從子模塊的目錄還是主存儲庫的目錄中嘗試它? – rednaw 2014-09-28 22:15:40

+0

在代碼中列出的代碼中,我試圖像普通的Git倉庫一樣打開子模塊庫,但這似乎不是JGit在這裏需要的,請參閱下面的自我回答。 – centic 2014-09-28 22:43:56

回答

1

似乎訣竅是不像常規Git存儲庫那樣打開子模塊的存儲庫,但使用JGit類SubmoduleWalk和父存儲庫來執行此操作!

以下爲我所做的工作,玩了多一些後:

 Repository subRepo = SubmoduleWalk.getSubmoduleRepository(repository, "fuse-jna"); 
+1

儘管'SubmoduleWalk.getSubmoduleRepository'工作得很好,我想澄清一下_Why_ FileRepositoryBuilder方法失敗:'setGitDir()'調用指定一個*相對路徑*(對應用程序的工作目錄)。如果更改爲'setGitDir(new File(parentRepo.getWorkTree(),「fuse-jna/.git」))'sub-repository也會被找到。如果你看看'getSubmoduleRepository()',你會發現那裏使用了類似的代碼。 – 2014-09-29 08:16:26

+0

非常感謝你的額外解釋,似乎我沒有在這裏讀到足夠的存儲庫生成器類,細節似乎隱藏在代碼中,setGitDir()在我所有其他用例中工作到目前爲止,而setWorkTree ()可能是一個更好的選擇對於大多數情況下... – centic 2014-09-29 12:31:46

+0

我仍然建議[首選setGitDir()通過setWorkDir](http://www.codeaffine.com/2014/09/22/access-git-repository-與-jgit /)。你問題的代碼片段中的錯誤是使用相對路徑(「fuse-jna/.git」)而不是絕對路徑(「/path/to/parent-repo/fuse-jna/.git」)。相對路徑相對於您的**程序的工作目錄**進行解釋(不要與存儲庫工作目錄混淆),也不適用於setWorkDir()。 – 2014-09-29 13:22:10