如何在不知道 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();
【讨论】:
CLIgit 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 本地是不是存在的情况下签出远程分支?的主要内容,如果未能解决你的问题,请参考以下文章