129

如何将 Git 遥控器的 HEAD 引用设置为指向“master”以外的内容?

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

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

  1. 克隆 repo 时,有这个,

    警告:远程 HEAD 引用不存在的 ref,无法结帐。

    这是令人困惑和不便的。

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

4

11 回答 11

65

一年前在 GitHub 上有几乎相同的问题。

这个想法是重命名主分支:

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

让master拥有你想要人们使用的东西,并在分支中完成所有其他工作。

(“ git-symbolic-ref HEAD refs/head/published”不会传播到远程仓库)

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


正如在这个线程中所说:(强调我的)

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

所以总结一下,你有 repoA并克隆它:

  • HEAD引用refs/heads/master并且存在
    -> 你会得到一个名为 的本地分支master,从origin/master

  • HEAD 引用refs/heads/anotherBranch并且存在
    -> 你会得到一个名为 的本地分支anotherBranch,从origin/anotherBranch

  • HEAD 引用refs/heads/master并且不存在
    ->“ git clone”抱怨

不确定是否有任何方法可以直接修改HEADrepo 中的 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 年第四季度),失败的“ ( man ) ”仍然说了一些暗示操作已通过的内容,这是具有误导性的。git remote set-head

请参阅Christian Schlack ( ) 的提交 5a07c6c(2020 年 9 月 17 日(由Junio C Hamano 合并 -- --提交 39149df中,2020 年 9 月 22 日)cschlack
gitster

remoteset-head:失败时不显示成功信息

签字人:Christian Schlack

如果出现错误,请抑制消息“origin/HEAD set to master”。

$ git remote set-head origin -a
error: Not a valid ref: refs/remotes/origin/master
origin/HEAD set to master
于 2009-09-28T05:49:37.093 回答
46

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

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

git remote set-head $REMOTE_NAME $BRANCH

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

git remote set-head origin develop

于 2014-03-01T02:34:04.167 回答
36

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

admin > Default Branch > (choose something)

完毕。

于 2012-06-22T06:30:47.317 回答
17

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

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

用法:

$ git symbolic-ref HEAD refs/heads/<branch name>
于 2010-11-09T13:48:44.097 回答
10

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

但是对于各种 git“农场”(多个用户可以通过受限界面管理 git repos:通过 http 和 ssh)有一个特定的答案:http: //Github.com、http : //Gitorious.org、http : // /repo.or.cz,Girar ( http://git.altlinux.org ) 。_

这些特定的答案可能对阅读此页面并考虑这些特定服务的人有用。

于 2010-06-03T01:08:25.813 回答
7

如果您可以从 shell 访问远程存储库,只需进入 .git(或主目录,如果它是一个裸存储库)并更改 HEAD 文件以指向正确的头。例如,默认情况下它总是包含“refs: refs/heads/master”,但如果您需要 foo 作为 HEAD,只需编辑 HEAD 文件并将内容更改为“refs: refs/heads/foo”。

于 2011-10-03T16:24:00.230 回答
6

您可以仅使用瓷器 Git 命令创建一个分离的主分支:

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

这给了我们一个带有粗鲁信息的分支(你可能想要更有礼貌)。现在我们创建我们的“真实”分支(我们称它为主干以纪念 SVN)并将其与master分离:

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

嘿,快! gitk --all将显示mastertrunk,它们之间没有链接。

这里的“魔法”是--amend导致git commit创建一个与当前 HEAD 具有相同父级的新提交,然后使 HEAD 指向它。但是当前的 HEAD 没有父级,因为它是存储库中的初始提交,因此新的 HEAD 也没有得到父级,从而使它们彼此分离。

旧的 HEAD 提交不会被git-gc删除,因为 refs/heads/master 仍然指向它。

仅需要--allow-empty标志,因为我们正在提交一棵空树。如果在git rm之后有一些git add ,那么就没有必要了。

事实上,您可以随时通过在存储库中对初始提交进行分支、删除其树、添加分离树、然后执行git commit --amend来创建分离分支。

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

于 2010-07-22T14:14:47.830 回答
5

与问题相关,我在搜索时最终来到这里:

如何让本地仓库知道 GitHub 上更改的默认分支

为了完整起见,添加答案:

git remote set-head origin -a
于 2019-09-13T06:23:04.263 回答
2

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

$>git branch main

接下来,将该分支推送到origin

$>git push origin main

现在,当您登录到您的 GitHub 帐户时,您可以转到您的存储库并选择 Settings>Default Branch 并选择“ main ”。

然后,如果您愿意,您可以删除 master 分支:

$>git push origin :master

于 2012-12-21T18:05:38.343 回答
0

对于 gitolite 人来说,gitolite 支持一个叫做 -- 等待它 -- 的命令symbolic-ref。如果您对 repo 具有 W(写入)权限,它允许您远程运行该命令。

于 2012-11-30T03:55:52.707 回答
-1

很简单,只需登录您的 GitHub 帐户,然后在导航菜单的最右侧选择Settings,在Settings 选项卡中选择Default Branch并返回到您的存储库的主页,这对我有用。

于 2013-01-27T18:44:34.193 回答