我想以编程方式更新HEAD而不对非裸仓库执行checkout或rebase.
我希望工作树和索引在操作后保持不变.
编辑
我需要更新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);
}
Run Code Online (Sandbox Code Playgroud)
答案隐藏在jgit源代码中的大约5个位置.
jgit v2.0.0.201206130900-r中的三个api命令为您更新HEAD:clone,checkout和rebase.如果适用,请使用其中之一.
这些都不适用:checkout和rebase会改变工作树和索引.
希望发布这个问题和答案将节省其他人我花在它上面的时间.