diff --git a/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java b/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java index 987aa768..432c4689 100644 --- a/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java +++ b/src/main/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepository.java @@ -56,6 +56,7 @@ public class JGitRepository extends AbstractGitRepository { private static final int MAX_DESCRIBE_CANDIDATES = 10; static final String COMMONDIR_FILE = "commondir"; + static final String GITDIR_FILE = "gitdir"; private static final String INDEX_FILE = "index"; static final String REF_LINK_PREFIX = "ref: "; @@ -118,7 +119,11 @@ final void buildRepository(File workTree, File gitDir) throws GitRepositoryExcep realGitDir = new File(realGitDirPath); } - if (realGitDir.exists()) { + File originalGitDirFile = new File(foundGitDir, GITDIR_FILE); + String originalGitDirPath = readFileToString(originalGitDirFile, "UTF-8").trim(); + File originalGitDir = new File(originalGitDirPath); + + if (originalGitDir.exists() && realGitDir.exists()) { if (headRef.equals(HEAD)) { File headFile = new File(foundGitDir, HEAD); String rawHead = readFileToString(headFile, Charset.forName("UTF-8")); @@ -127,7 +132,7 @@ final void buildRepository(File workTree, File gitDir) throws GitRepositoryExcep repositoryBuilder.setGitDir(realGitDir); repositoryBuilder.setIndexFile(new File(foundGitDir, INDEX_FILE)); - repositoryBuilder.setWorkTree(workTree); + repositoryBuilder.setWorkTree(originalGitDir.getParentFile()); } } } else { diff --git a/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java b/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java index 0729c86a..7c80530c 100644 --- a/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java +++ b/src/test/java/com/github/koraktor/mavanagaiata/git/jgit/JGitRepositoryTest.java @@ -11,6 +11,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -171,8 +172,12 @@ void testCreateWithLinkedWorktree() throws Exception { workTree.deleteOnExit(); } + File originalGitDir = new File(workTree, DOT_GIT); + Files.createFile(originalGitDir.toPath()); + FileUtils.writeStringToFile(new File(gitDir, HEAD), REF_LINK_PREFIX + R_HEADS + "test", Charset.forName("UTF-8")); FileUtils.writeStringToFile(new File(gitDir, COMMONDIR_FILE), realGitDir.getAbsolutePath(), Charset.forName("UTF-8")); + FileUtils.writeStringToFile(new File(gitDir, GITDIR_FILE), originalGitDir.getAbsolutePath(), Charset.forName("UTF-8")); FileRepositoryBuilder repoBuilder = mock(FileRepositoryBuilder.class, RETURNS_DEEP_STUBS); when(repoBuilder.findGitDir(any())).thenReturn(repoBuilder); when(repoBuilder.getGitDir()).thenReturn(gitDir);