2013-05-01 73 views
3

有什麼方法可以確定分支是使用JGit的遠程或本地分支(或兩者)?我有:確定分支是遠程還是本地(使用JGit)?

Map<String, Ref> allRefs = git.getRepository().getAllRefs(); 
Collection<Ref> values = allRefs.values(); 
for (Ref ref : values) { 
    refs.add(ref.getName()); 
} 

這給:

HEAD 
refs/heads/tmp01 
refs/heads/master 
refs/heads/newFeatureBranch 
refs/heads/sampleBranch 
refs/remotes/origin/master 
refs/remotes/origin/newFeatureBranch 

所以newFeatureBranch是本地和遠程分支。目前我檢查ref.getName()是否包含「遙控器/原點」。但是有沒有更好的方法來確定分支是遠程還是本地?

回答

2

術語「本地分支」通常指refs/head。
術語「遠程分支」通常指代refs/remotes中的參考。

要只列出當地的分支機構使用: git branchgit.branchList().call()

要只列出遠程分支機構使用: git branch -rgit.branchList().setListMode(ListMode.REMOTE).call()

要列出本地和遠程分支機構使用: git branch -agit.branchList().setListMode(ListMode.All).call()

來自ListBranchCommand.java的相應代碼爲:

if (listMode == null) { 
     refList = repo.getRefDatabase().getRefs(Constants.R_HEADS); 
} else if (listMode == ListMode.REMOTE) { 
     refList = repo.getRefDatabase().getRefs(Constants.R_REMOTES); 
} else { 
     refList = new HashMap<String,Ref>(repo.getRefDatabase().getRefs(
         Constants.R_HEADS)); 
     refList.putAll(repo.getRefDatabase().getRefs(
         Constants.R_REMOTES)); 
} 
2

在git中,所有分支都是本地分支。他們都住在本地存儲庫.git/refs中,都只是一個指向本地提交的指針。

你稱之爲「遠程分支」只是由git fetch創建的本地分支。

如何調用這些「遠程分支機構」由git config remote.origin.fetch決定,它通常會簡單地告訴git fetch創建一個名稱爲refs/remotes/origin/*的ref。

因此,檢查ref名稱的前綴是正確的方法。

+0

好,但據我所知'harpun'的建議也是正確的。我一直無法找到相應的方法來迭代本地分支與地圖 refList = git.getRepository()。getRefDatabase()。getRefs(Constants.R_REMOTES); ListBranchCommand setListMode = git.branchList()。setListMode(ListBranchCommand.ListMode.REMOTE); – u123 2013-05-01 19:32:40

1

一個選項將列出所有遠程分支機構,並檢查你感興趣的分支是否是這個名單上:

List<Ref> remoteBranches = git.branchList().setListMode(ListMode.REMOTE).call() 

您可以找到BranchCommandTest單元測試JGit爲branchList()更多的例子。


另一種選擇是從倉庫中只得到遠程引用:

Map<String, Ref> refList = repo.getRefDatabase().getRefs(Constants.R_REMOTES); 

查看更多在ListBranchCommand

相關問題