为什么我的 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
的后续调用会导致创建一个新分支,但 ref
是 null
。查看CheckoutCommand#L285,似乎ref.name = refs/heads/master
为master
,但对于test
,ref.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
中)解决了这个问题。
我有以下代码:
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
的后续调用会导致创建一个新分支,但 ref
是 null
。查看CheckoutCommand#L285,似乎ref.name = refs/heads/master
为master
,但对于test
,ref.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
中)解决了这个问题。