更改 Git 远程 HEAD 以指向除 master 之外的其他内容

如何设置 Git 远程的 HEAD 引用以指向除“ master”之外的其他内容?

我的项目有一个不使用“master”分支的策略(所有分支都要有有意义的名称)。此外,规范的主存储库只能通过 ssh://访问,不能通过 shell 访问(如 GitHub 或 Unfuddle)。

我的问题是,远程存储库仍然有一个 HEAD 引用,指向 refs/HEAD/master,但是我需要它指向一个不同的分支。这导致了两个问题:

  1. 克隆 repo 的时候,出现这个,

    warning: remote HEAD refers to nonexistent ref, unable to checkout.

    这让人很困惑,也很不方便。

  2. 基于 Web 的代码浏览器依赖于 HEAD 作为浏览树的基础。那么,我需要 HEAD 指向一个有效的分支。

213382 次浏览

一年前几乎就有 GitHub 上也有同样的问题了。

他们的想法是重新命名主分支:

git branch -m master development
git branch -m published master
git push -f origin master

让主人拥有你想让人们使用的东西,并在分支机构做所有其他的工作。

(一个“ git-symbolic-ref HEAD refs/head/published”不会被传播到远程回购)

这类似于“ 如何在 Git 中删除 source/master”。


正如 这根线中所说: (强调我的)

git clone”只创建一个本地分支。
为此,它查看远程回购的 HEAD ref,并创建一个与其引用的远程分支同名的本地分支。

因此,为了完成这个任务,你需要回购 A并克隆它:

  • HEAD引用并存在 refs/heads/master
    - > 你得到一个本地分支称为 master,从 origin/master开始

  • HEAD 引用 refs/heads/anotherBranch并且它存在
    - > 你得到一个本地分支称为 anotherBranch,从 origin/anotherBranch开始

  • HEAD 引用 refs/heads/master,而这并不存在
    - > 「 git clone」投诉

不确定是否有任何方法可以直接修改回购 中的 HEAD ref。

(这就是你问题的全部要点,我知道;)


也许唯一的方法就是使用 “面向穷人的出版物”,在这里你:

 $ git-symbolic-ref HEAD refs/head/published
$ git-update-server-info
$ rsync -az .git/* server:/local_path_to/git/myRepo.git/

但这将涉及到对服务器的写访问,这并不总是可能的。


正如我在“ Git: 在一个裸仓库中更改活动分支的正确方法?”中解释的,git remote set-head不会改变远程回购的任何东西。

它只会改变远程跟踪分支本地存储在您的本地回购,在 remotes/<name>/HEAD


对于 Git 2.29(2020年第四季度) ,失败的“ git remote set-head(< a href = “ https://git-scm.com/docs/git-remote # Document/git-Remote.txt-emset-headem”rel = “ nofollow noReferrer”> man )”仍然说了一些暗示操作经历的东西,这是误导。

犯下5a07c6c(2020年9月17日) by 克里斯蒂安 · 施拉克(cschlack)
(由 朱尼奥 · C · 哈马诺 gitster提交39149df合并,2020年9月22日)

remote : 当 set-head失败时不显示成功信息

签名: Christian Schlack

如果出现错误,取消消息“ source/HEAD set to master”。

$ git remote set-head origin -a
error: Not a valid ref: refs/remotes/origin/master
origin/HEAD set to master

(已经有基本相同的问题“ 在远程存储库中创建 git 符号引用”,没有得到普遍的答案。)

但是对于不同的 git“农场”(其中多个用户可以通过受限的界面管理 git 回购: 通过 http 和 ssh)有一个具体的答案: http://Github.comhttp://Gitorious.orghttp://repo.or.cz吉拉(http://git.altlinux.org)。

这些具体的答案可能对那些阅读本页面并思考这些具体服务的人有用。

  • 现在他们有一个下拉菜单,用于选择在 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳 http://repo.or.cz的 HEAD 分支(例如: http://repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git) ;
  • 以及 Http://gitorious.org(看看设置中的某个地方) ;
  • Http://github.com: admin > Default Branch > (select something)(感谢@srcSpider 的回答) ;
  • 因为 V2.6,默认的分支可以在 “项目”> “列表”> “分支”下的网页界面中设置。
  • 吉拉尔(运行在 http://git.altlinux.org上为 ALT 的发行版构建包)中,可以使用 ssh 接口: $Ssh git.alt help | fgrep Branch Default-Branch < path to git itory > [ < Branch > ] $ 例如,ssh git.alt default-branch packages/autosshd.git sisyphus改变远程回购 autosshd.git中的 HEAD,使其指向 sisyphus分支。

您可以只使用瓷 Git 命令创建一个分离的 师父分支:

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

这给了我们一个带有粗鲁信息的 师父分支(您可能希望更礼貌一些)。现在我们创建我们的“真正的”分支(我们称之为 后备箱,以表示对 SVN 的尊敬) ,并将其与 师父分离:

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

嘿,快! Gitk 所有人将显示 师父后备箱之间没有链接。

这里的“魔术”是,修正使 去死吧创建一个新的提交,其父级与当前 HEAD 相同,然后让 HEAD 指向它。但是当前的 HEAD 没有父元素,因为它是存储库中的初始提交,所以新的 HEAD 也没有父元素,这使得它们彼此分离。

旧的 HEAD 提交没有被 Git-GC删除,因为参考/HEAD/master 仍然指向它。

只需要 - 允许-空标志,因为我们提交的是一个空树。如果在 走吧之后还有一些 Git add,那就没有必要了。

事实上,您可以在任何时候通过分支存储库中的初始提交、删除其树、添加分离的树,然后执行 废物承诺,修正来创建分离的分支。

我知道这没有回答如何修改远程存储库上的默认分支的问题,但是它给出了如何创建分离分支的简洁答案。

见: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

这将设置 git 存储库中的默认分支,您可以在裸存储库或镜像存储库中运行它。

用法:

$ git symbolic-ref HEAD refs/heads/<branch name>

如果您可以从 shell 访问远程回购,只需进入。Git (或者主目录,如果它是一个空回购) ,并更改 HEAD 文件以指向正确的头。例如,默认情况下它总是包含‘ refs: refs/HEAD/master’,但是如果您需要 foo 作为 HEAD,只需编辑 HEAD 文件并将内容更改为‘ refs: refs/HEAD/foo’。

既然你提到了 GitHub,在他们的网站上做这件事只需要进入你的项目,然后..。

admin > Default Branch > (choose something)

成交。

对于基托人来说,基托人支持一个名为——稍等—— symbolic-ref的命令。它允许您远程运行该命令,如果您有 W (写)权限的回购。

首先,创建要设置为默认值的新分支,例如:

$>git branch main

接下来,把那根树枝推向 起源:

$>git push origin main

现在,当您登录到您的 GitHub 帐户时,您可以进入存储库,选择 Settings > Default Branch 并选择“ 总台

然后,如果你这样选择,你可以删除主分支:

$>git push origin :master

简单,只需登录到您的 GitHub 帐户,在导航菜单的最右侧选择 设定,在 设置选项卡选择 预设分行,然后返回到您的存储库的主页,这对我来说很有用。

更新: 这只适用于存储库的本地副本(“客户端”)。请参阅下面其他人的评论。

使用最新版本的 git (2014年2月) ,正确的程序应该是:

Git 远程设置头 $REMOTE _ NAME $BRANCH

例如,将远程 origin的磁头切换到分支 develop将是:

Git 遥控定位头起源开发

关于这个问题,我在这里搜索:

如何让本地回购知道 GitHub 上已更改的默认分支

为了完整起见,请补充答案:

git remote set-head origin -a

更改 git 远程 HEAD 的最佳和直接的方法是运行

git remote set-head origin DEV

起源通常是远程名称 DEV 远程分支名称