3

有什么方法可以使用 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”。但是有没有更好的方法来确定一个分支是远程的还是本地的?

4

3 回答 3

2

术语“本地分支”通常是指 refs/heads 中的 refs。
术语“远程分支”通常指 refs/remotes 中的 refs。

要仅列出您使用的本地分支机构: 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));
}
于 2013-05-01T23:14:02.127 回答
2

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

您所说的“远程分支”只是由git fetch.

如何调用这些“远程分支”由 决定git config remote.origin.fetch,它通常会简单地告诉git fetch创建一个带有 name 的 ref refs/remotes/origin/*

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

于 2013-05-01T14:30:25.770 回答
1

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

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

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


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

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

在ListBranchCommand中查看更多信息。

于 2013-05-01T14:30:33.493 回答