我学习git并使用JGit从java代码访问Git repos。默认情况下,Git不允许克隆到非空目录。我们如何确定已经为本地机器中的特定git repo完成了一个git clone,以便我们之后只能执行Git pull?
目前我正在使用这种方法:
if a root folder is existing in the specified location
clone has been done
pull
else
clone
不确定这是否正确。有更好的想法吗?
谢谢。
答案 0 :(得分:7)
这是我使用的方法,如Jgit邮件列表中所指定的那样:
检查是否存在git存储库:
if (RepositoryCache.FileKey.isGitRepository(new File(<path_to_repo>), FS.DETECTED)) {
// Already cloned. Just need to open a repository here.
} else {
// Not present or not a Git repository.
}
但这不足以检查git克隆是否“成功”。部分克隆可以使isGitRepository()计算为true。要检查git克隆是否成功完成,至少需要检查一个引用是否为null:
private static boolean hasAtLeastOneReference(Repository repo) {
for (Ref ref : repo.getAllRefs().values()) {
if (ref.getObjectId() == null)
continue;
return true;
}
return false;
}
感谢Shawn Pearce的回答!
答案 1 :(得分:2)
另一种方法是使用 JGit FileRepositoryBuilder 类。
<div id="messages"></div>
这个方案间接使用了与accepted answer相同的方案,但是去掉了RepositoryCache、FileKey和FS(FileSystem)的直接使用。虽然这些类在范围内是公开的,但它们感觉相当低级,并且个人让我感觉不舒服。
我不记得我们想出了这个解决方案。可能来自How to Access a Git Repository with JGit。
答案 2 :(得分:0)
@Izza 的回答中提到的技巧对我不起作用。我宁愿这样做:
Java 示例:
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.Repository
boolean isRepo(String fileDir) {
try {
Git Git = Git.open(new File(fileDir));
Repository repo = jGIt.getRepository();
for (Ref ref : repo.getAllRefs().values()) {
if (ref.getObjectId() == null)
continue;
return true;
}
return false;
} catch(Exception e) {
return false;
}
}