Jgit:裸仓库既没有工作树,也没有索引。

4

我在E盘创建了一个名为gitrepo的目录,完整路径为(E:\gitrepo),然后使用以下代码将一个仓库克隆到其中:

Git git=Git.cloneRepository()
                .setURI("samplelink.git")
                .setDirectory(new File("/E:/gitrepo"))
                .call();

然后我使用这段代码打开了一个代码库。
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;
}

一切都很正常,直到我尝试在本地代码库中添加一个文件。

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

然后在这一行代码上我遇到了异常

git.add().addFilepattern("testfile").call();

这里是异常信息。
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)

虽然代码文件创建在 E:\gitrepo 中,但我通过以下命令检查了 gitrepo 不是一个裸仓库:
/e/gitrepo (master)
$ git rev-parse --is-bare-repository 

并且它返回了false

请帮忙解决这个异常


你确定 repo 指向与 git rev-parse --is-bare-repository 相同的仓库吗?在 /e/gitrepo 中执行 ls 会显示什么?repo.getDirectory() 指向哪里? - Rüdiger Herrmann
是的,该repo指向/e/gitrepo,在该目录下运行git rev-parse --is-bare-repository并列出三个文件README.md、sample.txt和testfile。 - user9452933
log.info("Repository directory is {}", repository.getDirectory()); 输出 -> NFO: 仓库目录为 E:\gitrepo - user9452933
FileRepositoryBuilder 的使用方式不正确,你正在将它指向 gitrepo,而存储库元目录实际上是 gitrepo/.git。你应该用 Git.open(new File("/E:/gitrepo")) 替换这种用法。 - Mincong Huang
它成功了 :) 你可以将其发布为答案,以便帮助其他人。 - user9452933
很高兴能帮到你!我已经将其添加到@user9452933的解答中。 - Mincong Huang
1个回答

15

使用FileRepositoryBuilder打开Git仓库比较棘手。这是一个内部类。它的方法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
你应该使用 Git#open(File) 替换这个用法:
try (Git git = Git.open(new File("/E:/gitrepo"))) {
    // Do sth ...
}

1
默认的想法是调用Git构造函数,你需要一个仓库,然后在文档中构造一个仓库,它展示了OP方法。https://wiki.eclipse.org/JGit/User_Guide#Repository然而,在文档中没有提到Git.open。有点令人困惑。你的帖子为我节省了大量时间,谢谢! - dsingleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接