我想以编程方式更新HEAD,而不对非裸仓库执行checkout或rebase。
我希望工作树和索引在操作后保持不变。
修改
我需要更新HEAD的符号目标,而不是HEAD当前目标的提交ID。这更像是一个结账,而不是其他任何东西,除了我不能使用org.eclipse.jgit.api.CheckoutCommand
,因为它要求我更新路径,但我不想触摸工作树。 org.eclipse.jgit.api.CreateBranchCommand
也不合适,因为它需要一个特定的起点,因为我正在创建一个孤儿分支而不存在。
答案 0 :(得分:6)
这对我有用: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。如果适用,请使用其中之一。
这些都不适用:checkout和rebase会改变工作树和索引。
希望发布这个问题和答案可以节省其他人花在上面的时间。
答案 1 :(得分:0)
尝试org.eclipse.jgit.api.ResetCommand
并将其模式设置为SOFT
。