2012-08-27 37 views
3

我想以編程方式更新HEAD,而無需在非裸露的回購庫上執行結賬或兌換。如何使用jgit庫將git HEAD指向特定的引用?

我希望工作樹和索引在操作後不變。

EDIT

我需要更新HEAD的符號目標,而不是提交頭的當前目標的ID。除了我不能使用org.eclipse.jgit.api.CheckoutCommand,因爲它要求我更新路徑,但我不想觸摸工作樹。 org.eclipse.jgit.api.CreateBranchCommand也是不合適的,因爲它期望一個特定的起點,因爲我創建了一個孤兒分支,所以這個起點並不存在。

回答

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中的三個api命令v2.0.0.201206130900-r爲您更新HEAD:克隆,簽出和重新綁定。如果適用,請使用其中之一。

這些都不適用:checkout和rebase會改變工作樹和索引。

希望張貼這個問題和答案將節省時間,我不得不在其上花費。

0

嘗試org.eclipse.jgit.api.ResetCommand並將其模式設置爲SOFT

+0

也許要求「更新HEAD」是不正確的術語用法。實際上我創建了一個孤立分支,所以'git reset --soft'不是我想要的。我已經想出瞭如何根據[在jgit-dev列表](http://dev.eclipse.org/mhonarc/lists/jgit-dev/msg01397.html)上的建議創建無父母提交。我創建的無父提交應該已經具有提交樹中工作目錄下的所有文件。我不想要CheckoutCommand,因爲那樣會導致虛假的DirCache更新,或者如果我的提交不正確,我會丟失工作的dir文件。 – willkil