2015-10-16 89 views
2

我正在處理ANT任務,它調用一些使用JGit在git存儲庫上創建新分支並將其推送到遠程的java。我正在使用JGit 2.1.0。JGit創建新的本地分支並推送到遠程(分支不存在於遠程)

下面的代碼:

CreateBranchCommand bcc; 
CheckoutCommand checkout; 
Git git; 

try { 
    Repository repo = new FileRepositoryBuilder().readEnvironment().findGitDir(src).build(); 
    git = new Git(repo); 

    bcc = git.branchCreate(); 
    checkout = git.checkout(); 
} catch (IOException e) { 
    throw new BuildException("Could not access repository " + src, e); 
} 

try { 
     bcc.setName(branch) 
      .setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM) 
      .setStartPoint("origin/" + branch) 
      .setForce(force) 
      .call(); 

     checkout.setName(branch); 
     checkout.call(); 
} 
} catch (Exception e) { 
    throw new BuildException("Could not checkout repository " + src, e); 
} 

SRC變量設置到GIT回購的路徑(其已經被克隆)。 的分支變量設置爲:release_2_0_2變量設置爲:真正(既我有這個問題)。

之後有一個單獨的ANT任務來執行推送。

當運行上面的代碼中的異常被捕獲在第二陷阱:

org.eclipse.jgit.api.errors.RefNotFoundException: Ref origin/release_2_0_2 can not be resolved 

這個問題似乎是與setStartPoint("origin/" + branch)如果我硬編碼這「起源/主」它的工作原理。新的分支被創建。我只是試圖在本地創建一個新的分支,然後將其推送到遠程。我以https://stackoverflow.com/a/12928374/1860867爲例。

也許我誤解了CreateBranchCommand應該如何使用,我見過的所有例子都將起始點設置爲"origin/" + branch。 任何建議/澄清將有所幫助。

回答

4

使用setStartPoint()來指定新分支應該放在什麼位置。 setStartPoint指向的提交將是新分支的初始提交。

如果未明確指定起始點,則默認爲HEAD。請參閱Git文檔以獲取更多詳細信息:https://git-scm.com/docs/git-branch

因此,起點必須存在 - 您所指的遠程分支顯然不存在。

setUpstreamMode()即使您即將創建新分支也沒有用。當您爲遠程分支創建本地分支時,它旨在設置跟蹤。但是由於您還沒有遠程分支,因此不需要setUpstreamMode ewither。

創建本地分支後,請使用PushCommand將其發佈到遠程。

PushCommand pushCommand = git.push(); 
pushCommand.setRemote("origin"); 
pushCommand.setRefSpecs(new RefSpec("release_2_0_2:release_2_0_2")); 
pushCommand.call(); 

上述線推release_2_0_2分支到已經已知的遠程origin(在你已經從克隆的一個)。

該帖子How do I do git push with JGit?有更多關於如何推送JGit的細節。

+0

感謝您的信息和澄清。我認爲問題是我試圖使用的代碼只能用於現有的遠程分支。我可以使用一個標誌來指示分支不存在於遠程,然後使用你的邏輯。 – ptha

+0

很高興幫助。我發現寫下實現目標所需的本機Git命令序列並將它們翻譯成JGit API調用有時很有用。 –