如何在 JGit 中检出一个远程分支,而不知道它是否存在于本地?

10

使用普通的git checkout命令,它的功能与我期望的完全相同。这是我希望用同一段代码实现的用例:

1)git checkout branchname,其中branchname在本地不存在但在远程存在。

2)git checkout branchname,其中branchname已经在本地存在。

3)git checkout commitid

为了上下文,该存储库以以下方式进行了克隆:

repo = Git.cloneRepository()
    .setCloneSubmodules(true)
    .setURI(repoUrl)
    .setDirectory(createTempDir())
    .setCloneAllBranches(true)
    .call();

标准的JGit checkout命令不会自动在本地创建分支。以下代码适用于场景2和3:

repo.checkout()
      .setName(branchOrCommitId)
      .call();

随着修正案创建了一个新分支,它仅适用于场景1:

repo.checkout()
      .setCreateBranch(true)
      .setName(branchOrCommitId)
      .call();

考虑到标准的Git CLI已经提供了我需要的命令自动功能,是否有一个简洁的解决方案可供使用?


我有完全相同的需求。你最终做了什么? - Abhijit Sarkar
2个回答

9

如果本地分支不存在,则您要做的是创建一个分支。以下是使用流编写的代码示例,exampleRepo 是 git 存储库对象,检出命令是 CheckoutCommand,而 branchName 则为分支名称:

git.setCreateBranch(git.branchList()
        .call()
        .stream()
        .map(Ref::getName)
        .noneMatch(("refs/heads/" + branchName)::equals));

2

到目前为止,我找到的一种可能的解决方案是检查本地分支是否存在并且是一个ID,以便将问题中提到的两种方法结合起来:

    boolean createBranch = !ObjectId.isId(branchOrCommitId);
    if (createBranch) {
        Ref ref = repo.getRepository().exactRef("refs/heads/" + branchOrCommitId);
        if (ref != null) {
            createBranch = false;
        }
    }
    repo.checkout()
            .setCreateBranch(createBranch)
            .setName(branchOrCommitId)
            .call();

CLI中的git checkout命令尝试使用名称作为分支名称(通过添加refs/heads/来解析引用),如果失败,则扫描所有refs/remotes/引用以查看是否匹配。如果扫描结果恰好是1个refs/remotes/名称,则会像git checkout -b <name> --track <the-refs-remotes-name-we-just-found>一样操作。您上面的代码不完全相同:如果没有匹配项或有2个或更多匹配项会发生什么? - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接