确定分支是远程的还是本地的(使用JGit)?

时间:2013-05-01 14:16:20

标签: git 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()是否包含“remotes / origin”。但有没有更好的方法来确定分支是远程还是本地?

3 个答案:

答案 0 :(得分:2)

在git中,所有分支都是本地分支。它们都位于.git/refs中的本地存储库中,并且只是指向本地提交的指针。

您所谓的“远程分支”只是由git fetch创建的本地分支。

如何调用这些“远程分支”由git config remote.origin.fetch确定,git fetch通常只是告诉refs/remotes/origin/*创建名为{{1}}的参考号。

因此,检查引用名称的前缀是正确的方法。

答案 1 :(得分:2)

术语“本地分支”通常指refs / heads中的引用 术语“远程分支”通常指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 :(得分:1)

一个选项是列出所有远程分支,并检查您感兴趣的分支是否在此列表中:

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

您可以在BranchCommandTest JGit单元测试中找到branchList()的更多示例。


另一种选择是仅从存储库获取远程引用:

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

ListBranchCommand中查看更多内容。