更改Git远程头指向除了主人之外的东西
如何设置Git远程的HEAD引用指向除“主”之外的东西?
我的项目有一个政策,不使用“主”分支(所有分支都有有意义的名称)。 此外,规范主存储库只能通过ssh://访问,没有shell访问(如GitHub或Unfuddle)。
我的问题是,远程存储库仍然有一个头引用refs /头/主,但我需要它指向一个不同的分支。 这造成了两个问题:
-
在克隆回购的时候,
警告:远程HEAD是指不存在的裁判,无法结帐。
这是混乱和不方便。
-
基于网页的代码浏览器依赖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
的HEADautosshd.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将显示master和trunk之间没有链接。
这里的“魔术”是–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默认分支,并返回到您的存储库,为我做的伎俩的主页面。