如何找到本地分支的远程分支

时间:2016-10-26 14:08:24

标签: java git jgit

我从origin / master创建了与gerrit相关的本地分支12345

如何为本地分支12345

找到远程名称refs / for / master

输入是分支名称refs / heads / 12345或字符串

的一部分

我计算了分支名称:

   public String getCurrentBranch() throws GitException {
        try {
            Ref headRef;
            headRef = repository.getRef(Constants.HEAD);
            return Repository.shortenRefName(headRef.getLeaf().getName());
        } catch (IOException e) {
            throw new GitException(e.getMessage(), e);
        }
    }

如何找到远程refs / for / master到res / heads / 12345的结果?

我是否需要从配置中执行此操作?

2 个答案:

答案 0 :(得分:1)

您已将此标记交叉标记为(以及,这在此处似乎完全不合适,但我会将其留给其他人)和我只能给出一个纯粹的答案,这可能是无益的。

在Git中,我的意思是分支 name ,而不是structure - 最多可以有一个上游集。当分支具有上游集时,分支被称为跟踪上游。该上游通常是远程跟踪分支名称,例如master可以跟踪origin/master。名称origin/master远程跟踪分支,因此我们说“分支master跟踪远程跟踪分支origin/master”:这种情况发生的次数太多了“分支”和“轨道”这两个词的含义各不相同,但我们仍然坚持使用它。

跟踪另一个分支的分支根本不需要跟踪(即,具有上游)远程跟踪分支。例如,本地分支feature/zorg可能会跟踪本地分支develop。上游为您做的唯一事情就是自动执行更多fetchmergerebase(因此只有pull的{​​{1}}通过其他两个中的一个),并在运行fetch(或git branch -v等)和-vv时为您提供更多信息。当然,这些都是相当重要的,因此是设置上游的理由。

上游 - 给定分支正在跟踪的另一个分支的名称 - 分为两部分:远程,这是远程的名称if上游是远程跟踪分支,分支(名称)。如果远程设置为git status,则分支正在跟踪另一个本地分支。

这两部分可以通过.git config单独获得(两者都做同样的事情):

git config --get

请注意,第二部分未经过给定遥控器的$ git config --get branch.master.remote origin $ git config --get branch.master.merge refs/heads/master 规则指定的映射:

fetch

由于此映射表明$ git config --get-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/* 变为refs/heads/*,因此我们可以确定与远程refs/remotes/origin/*对应的远程跟踪分支的我们的名称{1}}实际上是refs/heads/master。 (当然,这种映射非常标准,有些软件可能只是假设它,但最好使用origin的设置实际映射。可能还有更多不止一个,因此refs/remotes/origin/master在这里。)

同样,如果remotes.origin.fetch部分设置为--get-all,则上游实际上是本地分支,并且不应将映射应用于remote部分。

在shell脚本中,您可以执行以下操作:

.

如果你想检查远程跟踪分支(当然你可能需要运行merge来更新它),这对映射没有帮助,但你可以得到那个< / em>使用branch="${1:-master}" has_upstream=true remote="$(git config --get branch.$branch.remote)" || has_upstream=false merge="$(git config --get branch.$branch.merge)" || has_upstream=false if ! $has_upstream; then echo "branch $branch has no upstream" else case "$remote" in .) echo "branch $branch tracks local branch $merge";; *) echo "branch $branch tracks $merge on $remote";; esac fi

git fetch

请注意,如果要使用短格式,则需要在结果为远程跟踪分支时从结果中删除git rev-parse。当然,如果上游是本地分支,则全名将以$ git rev-parse --symbolic-full-name master@{u} refs/remotes/origin/master 而不是refs/remotes/开头。如果你想要当前分支的上游,一个简单的refs/heads/就足够了; refs/remotes/语法允许您查找其他分支的上游名称。

如果没有配置上游,则@{u}后缀会使name@{u}失败:

@{u}

提供了另一种判断是否配置了上游的方法。

答案 1 :(得分:0)

很抱歉迟到了,但是您可以:

private static Ref findCurrentBranch(Git git) throws IOException, GitAPIException {
    String currentBranch = git.getRepository().getFullBranch();

    return git.branchList()
            .setListMode(ListBranchCommand.ListMode.ALL)
            .call()
            .stream()
            .filter(e -> e.getName().equals(currentBranch))
            .findFirst()
            .get();
}

private static Optional<Ref> findRemoteBranch(Git git, Ref branch) throws GitAPIException {
    Optional<Ref> remoteBranch = git.branchList()
            .setListMode(ListBranchCommand.ListMode.REMOTE)
            .call()
            .stream()
            .filter(e -> e.getObjectId().getName().equals(branch.getObjectId().getName()))
            .findFirst();

    return remoteBranch;
}