我从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的结果?
我是否需要从配置中执行此操作?
答案 0 :(得分:1)
您已将此标记交叉标记为git和jgit(以及java,这在此处似乎完全不合适,但我会将其留给其他人)和我只能给出一个纯粹的git答案,这可能是无益的。
在Git中,我的意思是分支 name ,而不是structure - 最多可以有一个上游集。当分支具有上游集时,分支被称为跟踪上游。该上游通常是远程跟踪分支名称,例如master
可以跟踪origin/master
。名称origin/master
是远程跟踪分支,因此我们说“分支master
跟踪远程跟踪分支origin/master
”:这种情况发生的次数太多了“分支”和“轨道”这两个词的含义各不相同,但我们仍然坚持使用它。
跟踪另一个分支的分支根本不需要跟踪(即,具有上游)远程跟踪分支。例如,本地分支feature/zorg
可能会跟踪本地分支develop
。上游为您做的唯一事情就是自动执行更多fetch
,merge
和rebase
(因此只有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;
}