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

how to find the remote branch of local branch

我从 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 的结果?

我需要从配置中进行吗?

您已将此交叉标记为两个 and (and then also , which seems completely inappropriate here, but I'll leave that to others) and I can only give a pure- 答案,这可能没有帮助。

在Git中,一个分支——我指的是分支名称,而不是structure——最多可以有一个上游设置。当一个分支有一个上游集合时,该分支被称为 track 上游。这个上游通常是一个远程跟踪分支名称,例如,master 可能会跟踪 origin/master。名称 origin/master 是一个 远程跟踪分支 ,所以我们说 "branch master tracks remote-tracking branch origin/master":"branch" 和 "tracks",每个都有不同的含义,但我们有点坚持。

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

upstream——给定分支正在跟踪的另一个分支的名称——设置为两部分:remote,如果上游是远程跟踪分支,则这是远程的名称,并且是 branch (名称)。如果远程设置为 .,分支正在跟踪另一个本地分支。

这两个部分可以通过git configgit 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/*,我们可以确定 我们的 对应于 [=36 的远程跟踪分支的名称=] 在远程 origin 实际上是 refs/remotes/origin/master。 (当然,这个映射是非常标准的,一些软件可能只是假设它,但更好的做法是使用 remotes.origin.fetch 的设置 执行 映射。有可能不止一个,因此这里是 --get-all。)

同样,如果remote部分设置为.,上游实际上是本地分支,merge部分不应应用任何映射。

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

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:

得到 that
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/origin/master

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

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

$ git rev-parse --symbolic-full-name target@{u}
fatal: no upstream configured for branch 'target'

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

抱歉来晚了,但是你开始了:

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;
}