我在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 HerrmannFileRepositoryBuilder
的使用方式不正确,你正在将它指向gitrepo
,而存储库元目录实际上是gitrepo/.git
。你应该用Git.open(new File("/E:/gitrepo"))
替换这种用法。 - Mincong Huang