【问题标题】:How to checkout a remote branch without knowing if it exists locally in JGit?如何在不知道 JGit 本地是否存在的情况下签出远程分支?
【发布时间】:2018-01-17 03:55:26
【问题描述】:

使用普通的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 已经在我正在寻找的命令中提供了自动功能,我是否可以使用一个巧妙的解决方案来解决这个问题?

【问题讨论】:

  • 我有完全相同的要求。你最后做了什么?

标签: java git jgit git-checkout


【解决方案1】:

到目前为止,我发现的一个可能的解决方案是检查本地分支是否存在并且是一个 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/ 引用让所有遥控器查看是否减去 refs/remotes/ 加上遥控器名称匹配。如果扫描结果恰好是 1 个refs/remotes/ 名称,则它的行为类似于git checkout -b <name> --track <the-refs-remotes-name-we-just-found>。您上面的代码并不完全相同:如果有 0 个或 2 个或多个匹配项会发生什么?
【解决方案2】:

当且仅当本地分支不存在时,您要做的是创建一个分支。这是我使用流想出的,其中 exampleRepo 是 git repo 对象,checkout command 是 CheckoutCommand,branchName 是分支名称。:

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

【讨论】:

    猜你喜欢
    • 2014-09-15
    • 2013-12-13
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多