我想以编程方式更新 HEAD 而不执行结帐或基于非裸回购。
我希望工作树和索引在操作后保持不变。
编辑
我需要更新 HEAD 的符号目标,而不是 HEAD 当前目标的提交 ID。这更像是一个结帐,除了我不能使用org.eclipse.jgit.api.CheckoutCommand,因为它需要我更新路径,但我不想接触工作树。org.eclipse.jgit.api.CreateBranchCommand也是不合适的,因为它需要一个特定的起点,因为我正在创建一个孤立分支,所以它不存在。
这对我有用:RefUpdate.link()。
例子:
Result updateHead(
Repository repo, String newHead, boolean force, boolean detach
) throws IOException {
RefUpdate refUpdate = repo.getRefDatabase().newUpdate(Constants.HEAD, detach);
refUpdate.setForceUpdate(force);
return refUpdate.link(newHead);
}
答案隐藏在 jgit 源代码中的大约 5 个地方。
jgit v2.0.0.201206130900-r 中的三个 api 命令为您更新 HEAD:clone、checkout 和 rebase。如果适用,请使用其中之一。
这些都不适用:结帐和变基会改变工作树和索引。
希望发布这个问题和答案可以节省其他人我不得不花在上面的时间。
尝试org.eclipse.jgit.api.ResetCommand将其模式设置为SOFT.