为什么我的 JGit checkout return null ref?

Why does my JGit checkout return null ref?

我有以下代码:

fun checkoutBranch(path: Path, name: String) {
    Git.open(path.toFile()).use { git ->
        val branchExists = git
                .branchList()
                .setListMode(ListBranchCommand.ListMode.ALL)
                .call()
                .filterNot { it.name.startsWith("refs/remotes/") }
                .map { it.name }
                .any { it.endsWith(name) }
        val ref = git
                .checkout()
                .setCreateBranch(!branchExists)
                .setName(name)
                .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
                .call()
    }
}

当我用 name = master 调用它时,一切都按预期工作。使用 name = test 的后续调用会导致创建一个新分支,但 refnull。查看CheckoutCommand#L285,似乎ref.name = refs/heads/mastermaster,但对于testref.name = refs/tags/test,然后ref设置为null.

Ref ref = repo.findRef(name);
if (ref != null && !ref.getName().startsWith(Constants.R_HEADS))
    ref = null;

这里发生了什么?这是新分支的预期行为吗?通过进入回购协议,我可以看到它处于分离的 HEAD 状态,可能导致了这个问题。

感谢@ElpieKay 提供线索。问题是由名为 test 的标签引起的。显然,在查找引用时,JGit 更喜欢使用标签而不是分支。

我通过将分支名称明确指定为 refs/heads/test(在 setName 中)解决了这个问题。