如何找到本地分支的远程分支
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 的结果?
我需要从配置中进行吗?
您已将此交叉标记为两个 git and jgit (and then also java, which seems completely inappropriate here, but I'll leave that to others) and I can only give a pure-git 答案,这可能没有帮助。
在Git中,一个分支——我指的是分支名称,而不是structure——最多可以有一个上游设置。当一个分支有一个上游集合时,该分支被称为 track 上游。这个上游通常是一个远程跟踪分支名称,例如,master
可能会跟踪 origin/master
。名称 origin/master
是一个 远程跟踪分支 ,所以我们说 "branch master
tracks remote-tracking branch origin/master
":"branch" 和 "tracks",每个都有不同的含义,但我们有点坚持。
跟踪另一个分支的分支根本不需要跟踪(即作为上游)远程跟踪分支。例如,本地分支 feature/zorg
可能会跟踪本地分支 develop
。拥有上游的唯一事情就是让更多的 fetch
、merge
和 rebase
自动化(因此 pull
只是 fetch
通过其他两个之一),并在 运行ning git branch -v
(或 -vv
等)和 git status
时为您提供更多信息。当然,这些都是相当重要的,因此是设置上游的理由。
upstream——给定分支正在跟踪的另一个分支的名称——设置为两部分:remote,如果上游是远程跟踪分支,则这是远程的名称,并且是 branch (名称)。如果远程设置为 .
,分支正在跟踪另一个本地分支。
这两个部分可以通过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/*
,我们可以确定 我们的 对应于 [=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;
}
我从 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 的结果?
我需要从配置中进行吗?
您已将此交叉标记为两个 git and jgit (and then also java, which seems completely inappropriate here, but I'll leave that to others) and I can only give a pure-git 答案,这可能没有帮助。
在Git中,一个分支——我指的是分支名称,而不是structure——最多可以有一个上游设置。当一个分支有一个上游集合时,该分支被称为 track 上游。这个上游通常是一个远程跟踪分支名称,例如,master
可能会跟踪 origin/master
。名称 origin/master
是一个 远程跟踪分支 ,所以我们说 "branch master
tracks remote-tracking branch origin/master
":"branch" 和 "tracks",每个都有不同的含义,但我们有点坚持。
跟踪另一个分支的分支根本不需要跟踪(即作为上游)远程跟踪分支。例如,本地分支 feature/zorg
可能会跟踪本地分支 develop
。拥有上游的唯一事情就是让更多的 fetch
、merge
和 rebase
自动化(因此 pull
只是 fetch
通过其他两个之一),并在 运行ning git branch -v
(或 -vv
等)和 git status
时为您提供更多信息。当然,这些都是相当重要的,因此是设置上游的理由。
upstream——给定分支正在跟踪的另一个分支的名称——设置为两部分:remote,如果上游是远程跟踪分支,则这是远程的名称,并且是 branch (名称)。如果远程设置为 .
,分支正在跟踪另一个本地分支。
这两个部分可以通过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/*
,我们可以确定 我们的 对应于 [=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
:
$ 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;
}