gpt4 book ai didi

jgit - 如果 JGit 中不存在创建它的存储库,如何打开它?

转载 作者:行者123 更新时间:2023-12-04 21:49:35 26 4
gpt4 key购买 nike

想出了:

/**
* Create a repo at the specified directory or open one if it already
* exists. Return a {@link Git} object...
*
* @param p
* Path to the repo root (the dir that contains the .git folder)
* @return a "Git" object to run porcelain commands on...
* @throws GitterException
* if the specified path cannot be resolved to a directory, or
* the repository failed to be build (...) or created
*/
public static Git open(Path p) throws GitterException {
if (!Files.isDirectory(p)) // default LinkOption is follow links
throw new GitterException(p + " can't be resolved to a directory");
Repository localRepo = null;
try {
localRepo = new FileRepository(Paths.get(p.toString(), ".git")
.toFile()); // do I have to specify the .git folder ?
} catch (IOException e) {
throw new GitterException("Failed to build Repository instance", e);
}
try {
localRepo.create();
} catch (IllegalStateException e) {
// ISE when the repo exists !
} catch (IOException e) {
throw new GitterException("Failed to create Repository instance", e);
}
return new Git(localRepo);
}

我错过了一些明显的东西吗?有这么复杂吗?

BaseRepositoryBuilder 中遇到 setMustExist(boolean)可以用吗?

最佳答案

我能找到的最短的解决方案是始终调用 create()并忽略已经存在的异常。

static Git openOrCreate(File gitDirectory) throws IOException {
Repository repository = new FileRepository(gitDirectory);
try {
repository.create();
} catch(IllegalStateException repositoryExists) {
}
return new Git(repository);
}

该代码有它的警告。 IllegalStateException似乎是一个可能会改变和破坏上述代码的实现细节。此外, FileRepository驻留在内部包中,不是公共(public) JGit API 的一部分。

以下是避免这些问题的解决方案:

static Git openOrCreate(File gitDirectory) throws IOException, GitAPIException {
Git git;
FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
repositoryBuilder.addCeilingDirectory(gitDirectory);
repositoryBuilder.findGitDir(gitDirectory);
if( repositoryBuilder.getGitDir() == null ) {
git = Git.init().setDirectory(gitDirectory.getParentFile()).call();
} else {
git = new Git(repositoryBuilder.build());
}
return git;
}

请注意,为了专注于代码片段的实际目的,省略了异常处理。
setMustExist对按需创建存储库没有帮助。它只会导致 build()提出 RepositoryNotFoundException如果在指定位置找不到存储库。
Repository表示存储库本身,而 Git作为一个工厂来创建在它包装的存储库上运行的命令。在工厂方法旁边有 close() ,它只是委托(delegate)给 Repository.close() .

存储库维护一个使用计数器,该计数器递减 close() .您可以在关闭后继续使用存储库(通过 Git 或存储库自己的方法),但如有必要,它将重新打开。为避免泄漏文件句柄,您不应在关闭后使用存储库。

可以找到关于如何使用 JGit 访问和初始化存储库的深入讨论

这里: http://www.codeaffine.com/2014/09/22/access-git-repository-with-jgit/

这里: http://www.codeaffine.com/2015/05/06/jgit-initialize-repository/

关于jgit - 如果 JGit 中不存在创建它的存储库,如何打开它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24620634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com