8

私はgitを学び、JGitを使用してJavaコードからGitリポジトリにアクセスします。デフォルトでは、Gitは空でないディレクトリにクローンを作成することを許可していません。ローカルマシンの特定のgitリポジトリに対してgitクローンがすでに実行されていることをどのように把握して、後でGitプルのみを実行できるようにするのでしょうか。

現在、私はこのアプローチを使用しています:

 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クローンが「成功」したかどうかを確認するには不十分です。部分的なクローンにより、isGitRepository()がtrueと評価される可能性があります。git cloneが正常に実行されたかどうかを確認するには、少なくとも1つの参照がnullでないかどうかを確認する必要があります。

private static boolean hasAtLeastOneReference(Repository repo) {

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

    return false;
}

答えてくれたShawnPearceに感謝します!

于 2012-11-28T14:03:03.487 に答える
2

別のアプローチは、JGitFileRepositoryBuilderクラスを使用することです。

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(FileSystem)の直接的な使用を削除します。これらのクラスは公開されていますが、レベルがかなり低く、個人的には使いにくいと感じています。

私たちがこの解決策を思いついたのを正確に覚えていません。JGitを使用してGitリポジトリにアクセスする方法からの可能性があります。

于 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 に答える