Git - 显示远程分支的远程名称

3

有没有一条Git命令可以显示远程分支的远程名称?

目前,我使用像...这样的shell工具从远程分支ref中提取远程名称。

$ echo "remote-name/branch-name" | sed -r 's;^([^/]+)/.*;\1;'
remote-name

有时为了进行验证,需要将其传递。
$ git rev-parse --symbolic-full-name "remote-name/branch-name" | ...

我想知道是否有内置命令,类似于:

$ git wanted-command [wanted options] "remote-name/branch-name"
remote-name

我研究了rev-parseremotels-remote的手册。


git branch -av 应该可以。 - stdcall
不,它显示所有分支,包括它们的跟踪(远程)分支(如果有的话)。我想使用官方的Git命令获取远程名称(如“origin”),而不是通过解析分支名称来实现。 - try-catch-finally
你是对的。我的错... - stdcall
2个回答

3

虽然不是最美观的解决方案,但我认为它应该通常有效。 (我觉得应该有更好的方法,但我暂时想不到。)

symref=$(git symbolic-ref --short HEAD)
git config --local "branch.$symref.remote"

为了完整性,并总结下面的一些评论,远程跟踪分支的名称(可能与本地存储库中的远程引用名称不同)可以从branch.$symref.merge获取。


这是正确的方法。但请注意,如果上述输出为“。”,则“remote”是您自己的本地存储库,即您的本地分支foo可能正在“跟踪”您自己的本地分支master。此外,如果您想知道分支在“远程”的名称是什么,则在branch.$symref.name中,但由于fetch =行的工作方式,本地远程跟踪分支可能具有其他名称(但这很少见,可能到不存在的程度,这只是可能)。 - torek
1
通常情况下,如果你查看 .git/config 中的 origin 远程仓库,你会看到:fetch = +refs/heads/*:refs/remotes/origin/*。这就是为什么他们的 master 变成了你的 origin/master,两个 * 是匹配的。但是,如果你找到的是 fetch = +refs/heads/master:refs/remotes/origin/xyzzy,那么 他们的 master 就变成了 你的 origin/xyzzy。如果你想跟踪他们的分支,你应该设置 branch.master.remote = origin,但是 branch.master.merge = master,即使你正在跟踪 origin/xyzzy。这是一种历史上的偶然。 - torek
1
merge 行列出了分支在 他们 存储库中的名称,因此要找到分支在您自己的存储库中的名称,必须通过与远程相关联的 fetch = 行进行映射。将该映射的输出设置为除 origin/master 以外的任何内容都是相当疯狂的,但是它是允许的。我实际上不确定 git 的哪些部分会对这种操作做出良好或不良的反应。 - torek
@torek,我也没看到它,但是你提到了也可以使用branch.$symref.name来查看所在远程分支的名称。不过...根据您后面的评论,我认为您应该在第一时间使用branch.$symref.merge - Etan Reisner
哦,对了,应该是“合并”,而不是“命名”。打错字了(更像是个思维错误)!可惜现在不能编辑了。 - torek
显示剩余3条评论

2
如果你使用的是本地引用而非远程引用,你可以使用%(upstream:remotename)格式和git for-each-ref一起使用。
我将其与git symbolic-ref -q HEAD一起使用,以获取当前检出的远程名称:
remote=$(git for-each-ref --format='%(upstream:remotename)' "$(git symbolic-ref -q HEAD)")

使用最常见的遥控器进行演示:
% git for-each-ref --format='%(upstream:remotename)' "$(git symbolic-ref -q HEAD)" 
origin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接