确定上游存储库上的默认分支

问题描述 投票:0回答:2

当本地存储库将默认分支更改为与上游存储库不同的内容时,是否有方法确定上游存储库上的默认分支是什么?

git
2个回答
2
投票

解决方案1:
git rev-parse
(推荐)

就这样做:

git rev-parse --abbrev-ref refs/remotes/origin/HEAD

这应该打印出远程的

HEAD
分支,对于托管仓库来说应该是默认分支,无论是
origin/main
origin/master
origin/develop
origin/stable
,等等。 (如果远程实际上是另一个工作副本,则远程
HEAD
是签出分支。)

您的本地 Git 存储库会缓存此信息,作为参考

refs/remotes/origin/HEAD
(将
origin
替换为远程名称的任何名称。)通常这会由
git clone
自动设置,但如果您的本地存储库有稍微不寻常的历史记录(例如,如果您的本地存储库在远程存储库之前开始其生命),则该本地引用可能会丢失。在这种情况下,这通常会重新创建它:

git remote set-head origin --auto

这将联系远程,检查其实际的

HEAD
分支是什么,并更新本地 Git 存储库的
refs/remotes/origin/HEAD
引用。

由于这是本地缓存的信息,因此如果远程存储库更改其默认分支,它可能会过时。

git fetch
不会检测到该更改,但
git remote set-head origin --auto
将检查远程 HEAD 是什么并更新此本地引用以匹配。因此,在远程存储库中进行任何此类更改后,您可能需要手动运行该命令。

总结

git rev-parse --abbrev-ref refs/remotes/origin/HEAD

快速给出答案,但失败或错误的可能性很小;

git remote set-head origin --auto && 
  git rev-parse --abbrev-ref refs/remotes/origin/HEAD

总是正确的,但速度较慢。

解决方案2:
git ls-remote

git ls-remote --symref origin HEAD

输出示例:

ref: refs/heads/main    HEAD
bbac5bc097f944b3ad94e723364c5513d27b1910    HEAD

你甚至可以这样做:

git ls-remote --symref origin HEAD |
    egrep '^ref: refs/heads/.*\tHEAD$' |
    cut -d/ -f3- |
    cut $'-d\t' -f1

这只会打印

main
(或
master
,或其他)。

我推荐解决方案1,因为它更简单,而且我不认为这个解决方案比它有任何真正的优势。

解决方案 3:GitHub CLI

如果远程恰好是 GitHub 或 GitHub Enterprise,您还可以使用 GitHub CLI

gh repo view  --json defaultBranchRef --jq .defaultBranchRef.name

这将打印

main
master
,或者任何远程默认分支名称。

我也不推荐这个解决方案,因为解决方案 1 和 2 适用于任何 Git 主机(GitHub、GitLab、BitBucket、Gitea 等)。另外,它需要您安装和配置另一个 CLI 工具。


0
投票

Git 中没有“默认分支”的符号。本地和远程存储库中只有

HEAD
。您经常在本地移动
HEAD
,因此上游
HEAD
和本地
HEAD
之间几乎总是存在差异。

© www.soinside.com 2019 - 2024. All rights reserved.