Jgit:Bare Repository既没有工作树,也没有索引

use*_*933 3 java git jgit

我在E中创建了一个目录,命名为gitrepo full path is(E:\ gitrepo)之后我用以下代码克隆了一个存储库

Git git=Git.cloneRepository()
                .setURI("samplelink.git")
                .setDirectory(new File("/E:/gitrepo"))
                .call();
Run Code Online (Sandbox Code Playgroud)

然后我用这段代码打开了一个存储库

public Repository openRepository() throws IOException {
    FileRepositoryBuilder builder = new FileRepositoryBuilder();

    Repository repository = builder.setGitDir(new File("/E:/gitrepo"))
            .readEnvironment() // scan environment GIT_* variables
            .findGitDir() // scan up the file system tree
            .build();
     log.info("Repository directory is {}", repository.getDirectory());

    return repository;
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到这里我试图在这个本地存储库中添加一个文件

Repository repo = openRepository();
            Git git = new Git(repo);
            File myfile = new File(repo.getDirectory()/*.getParent()*/, "testfile");
            if (!myfile.createNewFile()) {
                throw new IOException("Could not create file " + myfile);
            }
            log.info("file created at{}", myfile.getPath());
            git.add().addFilepattern("testfile").call();
Run Code Online (Sandbox Code Playgroud)

然后我在这条线上得到了例外

git.add().addFilepattern("testfile").call();
Run Code Online (Sandbox Code Playgroud)

这是例外

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: Bare Repository has neither a working tree, nor an index
    at org.eclipse.jgit.lib.Repository.getIndexFile(Repository.java:1147)
    at org.eclipse.jgit.dircache.DirCache.lock(DirCache.java:294)
    at org.eclipse.jgit.lib.Repository.lockDirCache(Repository.java:1205)
    at org.eclipse.jgit.api.AddCommand.call(AddCommand.java:149)
    at com.km.GitAddFile.addFile(GitAddFile.java:26)
Run Code Online (Sandbox Code Playgroud)

虽然在E:\gitrepo i中创建的文件代码已通过此命令检查gitrepo是非裸存储库

/e/gitrepo (master)
$ git rev-parse --is-bare-repository 
Run Code Online (Sandbox Code Playgroud)

并返回 false

请帮助我如何解决此异常

Min*_*ang 9

使用Git存储库FileRepositoryBuilder很棘手.这是一个内部课程.其方法setGitDir(File)定义了存储库元数据(.git文件夹)的位置.换句话说,它用于构建Git裸存储库.您可以通过以下方式证明Repository#isBare():

Repository repository = builder.setGitDir(new File("/E:/gitrepo"))
        .readEnvironment() // scan environment GIT_* variables
        .findGitDir() // scan up the file system tree
        .build();
repository.isBare(); // returns true
Run Code Online (Sandbox Code Playgroud)

您应该用以下方法替换此用法Git#open(File):

try (Git git = Git.open(new File("/E:/gitrepo"))) {
    // Do sth ...
}
Run Code Online (Sandbox Code Playgroud)