2017-08-09 84 views
0

使用普通的git checkout這個命令的工作原理就是我所期望的。下面是使用案例我想允許與同一段代碼:如何在不知道JGit本地存在的情況下檢出遠程分支?

1)git checkout branchname其中branchname本地不存在,但確實在遠程

2)git checkout branchname其中branchname已經在本地存在

3)git checkout commitid

對於上下文中,儲存庫先前已經克隆如下:

repo = Git.cloneRepository() 
    .setCloneSubmodules(true) 
    .setURI(repoUrl) 
    .setDirectory(createTempDir()) 
    .setCloneAllBranches(true) 
    .call(); 

標準JGit簽出命令不會自動在本地創建分支。下面的代碼段工程方案2和3:

repo.checkout() 
     .setName(branchOrCommitId) 
     .call(); 

隨着修訂創建一個新的分支,只與方案1的工作:

repo.checkout() 
     .setCreateBranch(true) 
     .setName(branchOrCommitId) 
     .call(); 

有沒有很好地解決了這個問題,我可以使用,考慮到標準Git CLI已經在我正在查找的命令中提供了自動功能?

+0

我有完全一樣的需求。你最終做了什麼? –

回答

0

一個可能的解決這個到目前爲止我發現是檢查本地分支是否爲了在問題中提到的兩種方法結合起來存在,是一個ID:

boolean createBranch = !ObjectId.isId(branchOrCommitId); 
    if (createBranch) { 
     Ref ref = repo.getRepository().exactRef("refs/heads/" + branchOrCommitId); 
     if (ref != null) { 
      createBranch = false; 
     } 
    } 
    repo.checkout() 
      .setCreateBranch(createBranch) 
      .setName(branchOrCommitId) 
      .call(); 
+0

CLI''git checkout'命令只是嘗試使用名稱作爲分支名稱(試圖通過添加'refs/heads /'來解析ref,如果失敗則掃描所有'refs/remotes /'引用對於所有遙控器來查看是否減去'refs /遙控器/'加上遙控器名稱匹配。如果掃描的結果恰好是1'refs/remotes /'name,那麼它就像'git checkout -b --track '一樣。上面的代碼並不完全相同:如果有0個或2個或更多個匹配,會發生什麼情況? – torek

相關問題