如何在不知道 JGit 本地是不是存在的情况下签出远程分支?

Posted

技术标签:

【中文标题】如何在不知道 JGit 本地是不是存在的情况下签出远程分支?【英文标题】: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 已经在我正在寻找的命令中提供了自动功能,我是否可以使用一个巧妙的解决方案来解决这个问题?

【问题讨论】:

我有完全相同的要求。你最后做了什么? 【参考方案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);

【讨论】:

以上是关于如何在不知道 JGit 本地是不是存在的情况下签出远程分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改修改后的时间戳的情况下签入文件?

JGit:我可以在不检查的情况下找出某个特定标签是不是存在于 Git 存储库中吗?

PHP - 在不知道扩展名的情况下检查文件是不是存在

在不知道主体实体是不是存在的情况下创建依赖实体[关闭]

在不签出的情况下将文件提交到不同的分支

如何在不本地存储的情况下知道图像文件大小