更改Git远程头指向除了主人之外的东西

如何设置Git远程的HEAD引用指向除“主”之外的东西?

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

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

  1. 在克隆回购的时候,

    警告:远程HEAD是指不存在的裁判,无法结帐。

    这是混乱和不方便。

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

一年前GitHub上的问题几乎是一样的 。

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

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

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

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

这与“ 如何删除Git中的origin / master ”类似。


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

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

所以要包装起来,你有回购A并克隆它:

  • HEAD引用了refs/heads/master并存在
    – >你从本地/主人那里得到一个叫做主人的地方分支

  • HEAD引用了refs/heads/anotherBranch并且存在
    – >你从本地origin/anotherBranch获得一个名为anotherBranch的本地分支

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

不知道是否有任何方法可以直接修改HEAD中的HEAD参考

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


也许唯一的办法就是“为穷人出版” ,你可以:

  $ 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不会改变git remote set-head 仓库中的任何东西。

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

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

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

git remote set-head $REMOTE_NAME $BRANCH

因此,例如,将遥控器上的开关切换到分支develop将是:

git remote set-head origin develop

既然你提到GitHub,在他们的网站上做简单的进入你的项目,然后…

admin > Default Branch > (choose something)

完成。

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

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

用法:

$ git symbolic-ref HEAD refs / heads / <分支名称>

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

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

这些具体的答案可能对读这个页面和思考这些特定服务的人有用。

  • 现在他们有一个下拉菜单,用于selecthttp://repo.or.cz中;的HEAD分支(例如: http ://repo.or.cz/editproj.cgi?name=for-me-and-for-for- all_imz.git );
  • 并在http://gitorious.org ,也(看看设置中的某个地方);
  • 并在http://GitHub.com:admin >默认分支>(select的东西)(感谢@ srcspider的答案);
  • 从v2.6开始 ,可以在“项目”>“列表”>“分支”下的Web界面中设置默认分支。 在v2.12中,Gerrit 添加了一个可以通过ssh使用 的新的set-head命令 。
  • 和在Girar (运行在http://git.altlinux.org为ALT的发行版构build包),可以使用以下的ssh接口:; $ ssh git.alt help | fgrep branch default-branch <path to git repository> [<branch>] $ $ ssh git.alt help | fgrep branch default-branch <path to git repository> [<branch>] $例如ssh git.alt default-branch packages/autosshd.git sisyphus将远程autosshd.git的HEAD autosshd.git指向sisyphus分支。

如果你可以从shell中访问remote repo,只需进入.git(或者主dir,如果它是裸回购的),并将HEAD文件改为指向正确的头部。 例如,默认情况下,它总是包含'refs:refs / heads / master',但是如果您需要foo作为HEAD,只需编辑HEAD文件并将其内容更改为'refs:refs / heads / foo'即可。

您只能使用瓷Git命令创build一个分离的分支:

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

这给了我们一个粗鲁的信息分支(你可能想要更有礼貌)。 现在我们创build我们的“真正的”分支(让我们称之为SVN 主干 ),并将其与主分离

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

嘿,快死了! gitk –all将显示mastertrunk之间没有链接。

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

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

只有–allow-empty标志是必需的,因为我们提交了一个空树。 如果在git rm之后添加了一些git ,那就没有必要了。

事实上,你可以随时创build一个分离的分支,通过分支库中的初始提交,删除它的树,添加你分离的树,然后做git commit –amend

我知道这不会回答如何修改远程存储库上的默认分支的问题,但它提供了一个干净的答案,如何创build一个分离的分支。

首先,创build您希望设置为默认的新分支,例如:

$>git branch main

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

$>git push origin main

现在,当你login到你的GitHub帐户,你可以去你的仓库,select设置>默认分支,并select“ 主”

那么,如果你这样select,你可以删除主分支:

$>git push origin :master

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

简单的只需login到你的GitHub帐户,在导航菜单最右边的select设置 ,在设置选项卡select默认分支,并返回到您的存储库,为我做的伎俩的主页面。