8

我学习 git 并使用 JGit 从 Java 代码访问 Git 存储库。Git 默认不允许克隆到非空目录。我们如何确定已经为本地机器中的特定 git repo 完成了 git clone,以便我们只能在随后执行 Git pull?

目前我正在使用这种方法:

 if a root folder is existing in the specified location
     clone has been done
     pull 
 else
     clone

不确定这是否正确。有更好的想法吗?

谢谢你。

4

3 回答 3

10

这是我使用的方法,在 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 clone 是否“成功”。部分克隆可以使 isGitRepository() 评估为真。要检查 git clone 是否成功完成,至少需要检查一个引用是否不为空:

private static boolean hasAtLeastOneReference(Repository repo) {

    for (Ref ref : repo.getAllRefs().values()) {
        if (ref.getObjectId() == null)
            continue;
        return true;
    }

    return false;
}

感谢肖恩皮尔斯的回答!

于 2012-11-28T14:03:03.487 回答
2

另一种方法是使用 JGit FileRepositoryBuilder 类。

public boolean repositoryExists(File directory) {

    boolean gitDirExists = false;

    FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
    repositoryBuilder.findGitDir(directory);

    if (repositoryBuilder.getGitDir() != null) {

        gitDirExists = true;
    }

    return gitDirExists;
}

此解决方案间接使用与接受的答案相同的解决方案,但它删除了 RepositoryCache、FileKey 和 FS(文件系统)的直接使用。虽然这些类在范围内是公开的,但它们感觉相当低级,并且我个人觉得使用起来不太方便。

我不记得我们到底想出了这个解决方案。它可能来自How to Access a Git Repository with JGit

于 2021-06-10T17:10:18.867 回答
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;
    }
 }
于 2021-03-26T09:35:33.777 回答