如何更改 HEAD 指向的远程分支?

How to change which remote branch HEAD points to?

SO 上有很多与此相关的答案,但 none 似乎对我有用。

我正在使用 git 版本。 2.25.1.

git remote show origin

显示:

 remote origin   Fetch URL: /opt/ideatree   Push  URL: /opt/ideatree  
 HEAD branch: dotImport   
 Remote branches:
     dotImport      tracked
     getProdWorking tracked
     master         tracked   Local branch configured for 'git pull':
     master merges with remote master   Local ref configured for 'git push':
     master pushes to master (up to date)

本地没问题。我试图将“HEAD 分支:dotImport”更改为“HEAD 分支:master”。

因为 'dotImport' 最终不是主分支我想在远程删除它,但只要 HEAD 设置为 dotImport:

就不会发生
git push origin --delete dotImport
remote: error: By default, deleting the current branch is denied, because the next
remote: 'git clone' won't result in any file checked out, causing confusion.

正在尝试重新分配 HEAD:

git symbolic-ref HEAD refs/heads/master

没有效果。

git remote set-head origin --auto

产量:

origin/HEAD set to dotImport

就是不动。

这是它在遥控器上的另一种看法,与 'git remote show origin' 所说的不一致:

 git branch -r
  origin/HEAD -> origin/master
  origin/dotImport
  origin/master

也许我遗漏了一个步骤,即使用本地进行的 HEAD 更改来更新遥控器?

我在 SO 上阅读的答案(例如 that question or that question 的答案)似乎表明它无法完成——不能仅通过 git 从遥控器的克隆中完成。

你应该看看你是否可以访问中央仓库(例如,如果你有一个自托管的 gitlab 服务器)并从中央仓库本身更改 HEAD,或者通过 Web GUI(对于 github.com 例如)为您的项目设置“默认分支”。

origin 的 URL 是 /opt/ideatree。这没有“方案”部分(前面没有 https://git://ssh://),所以它只是一个本地文件:您计算机上的 Git 软件将在您自己的机器上调用 Git 软件。它会调用自己!它会询问自己——它自己的另一个实例——到 cd /opt/ideatree,它应该在哪里找到另一个 Git 存储库。

正是 other Git 存储库,在 /opt/ideatree 中,分支 dotImport 已签出。这会产生这些错误消息(来自“other”Git——第二个 Git 实例,运行ning in /opt/ideatree):

error: By default, deleting the current branch is denied, because the next
'git clone' won't result in any file checked out, causing confusion.

这些错误消息会转发给您自己的 Git,它会在每行前面加上单词 remote:,从而导致您看到两行。

Here's another view of what it looks like on the remote, which disagrees with what 'git remote show origin' says:

 git branch -r
  origin/HEAD -> origin/master
  origin/dotImport
  origin/master

您是如何获得这种观点的? (如果您通过 运行ning git branch -r 在您自己的克隆中本地获得它,请注意 -r 显示的是您的克隆目前拥有的,而不是远程目前拥有的。 运行 git fetch 更新你的克隆拥有的东西,除了它不更新 origin/HEAD;要做到这一点,你必须 运行 git remote origin set-head --auto。)确实如此不同意你的 git remote show origin 所说的内容,也不同意你收到的错误消息。

至少在获得适当权限的情况下,您应该能够:

cd /opt/ideatree
git checkout master

切换/opt/ideatree到分支master。但是,如果 /opt/ideatree 本身就是 git push 操作的 target,通常最明智的做法是将其设置为 bare 存储库:一个根本没有工作树的存储库。在这种情况下,没有任何东西被签出,这意味着不能处理任何分支,这意味着任何分支名称都可以被推送到(尽管不能删除 HEAD 分支,这意味着你想使用 git symbolic-ref 命令来调整它,如果你决定使用 main 而不是 master 例如)。不过,所有这一切都发生在 /opt/ideatree;在那里完成后,您 cd 回到您工作的地方。

(如果你想能够进行推送部署,你需要一些额外的胶水代码。Git 部署系统很差,但我没有任何其他系统推荐。)