将Git远程HEAD更改为指向除master之外的其他东西

问题描述 投票:116回答:10

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

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

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

  1. 克隆回购时,有这个, 警告:远程HEAD是指不存在的ref,无法结帐。 这令人困惑和不方便。
  2. 基于Web的代码浏览器依赖于HEAD作为浏览树的基础。我需要HEAD指向一个有效的分支,然后。
git git-branch git-remote
10个回答
61
投票

一年前几乎有same question on GitHub

我的想法是重命名主分支:

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

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

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

这类似于“How do I delete origin/master in Git”。


正如this thread所说:(强调我的)

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

所以要包装它,你有repo A并克隆它:

  • HEAD引用refs/heads/master并存在 - >从origin / master开始,你得到一个名为master的本地分支
  • HEAD引用refs/heads/anotherBranch并存在 - >从anotherBranch开始,你得到一个名为origin/anotherBranch的本地分支
  • HEAD引用refs/heads/master并且不存在 - >“git clone”抱怨

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

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


也许唯一的方法是"publication for the poor",你在哪里:

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

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


正如我在“Git: Correct way to change Active Branch in a bare repository?”中解释的那样,git remote set-head不会改变遥控器上的任何东西。

它只会在remotes/<name>/HEAD中更改本地仓库中本地存储的远程跟踪分支。


-1
投票

只需登录您的GitHub帐户,然后在导航菜单的最右侧选择设置,在设置选项卡中选择默认分支,然后返回到您的存储库的主页面。


40
投票

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

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

git remote set-head $REMOTE_NAME $BRANCH

因此,例如,将远程origin上的头转换为分支develop将是:

git remote set-head origin develop


34
投票

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

admin > Default Branch > (choose something)

完成。


11
投票

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

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

用法:

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

9
投票

(已经有基本相同的问题“create a git symbolic ref in remote repository”,没有得到普遍回答。)

但是对于各种git“farm”(其中多个用户可以通过受限制的界面管理git repos:http:http和ssh)有一个特定的答案:http://Github.comhttp://Gitorious.orghttp://repo.or.czGirarhttp://git.altlinux.org)。

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


7
投票

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


5
投票

您只需使用瓷器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"

嘿,presto! gitk --all将显示master和trunk,它们之间没有链接。

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

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

只需要--allow-empty标志,因为我们提交的是空树。如果在git rm之后有一些git add,则没有必要。

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

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


2
投票

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

$>git branch main

接下来,将该分支推送到原点:

$>git push origin main

现在,当您登录GitHub帐户时,可以转到存储库并选择“设置”>“默认分支”,然后选择“主要”。

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

$>git push origin :master


0
投票

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

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