如何设置Git遥控器的HEAD引用以指向除“master”之外的其他内容?
我的项目有一个不使用“主”分支的策略(所有分支都有有意义的名称)。此外,规范主存储库只能通过ssh://访问,没有shell访问权限(如GitHub或Unfuddle)。
我的问题是远程存储库仍然有一个HEAD引用refs / heads / master,但我需要它指向另一个分支。这导致了两个问题:
克隆回购时,有这个,
警告:远程HEAD指的是不存在的ref,无法结账。
这令人困惑和不方便。
基于Web的代码浏览器依赖于HEAD作为浏览树的基础。我需要HEAD指向一个有效的分支,然后。
答案 0 :(得分:60)
一年前几乎有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
,并创建一个与其引用的远程分支同名的本地分支。所以要把它包起来,你有回购A并克隆它:
- 开始
HEAD
引用refs/heads/master
并且存在 - >你会得到一个名为master的本地分支,从origin / master- 开始,您将获得一个名为
HEAD引用
refs/heads/anotherBranch
并存在 - >从anotherBranch
origin/anotherBranch
的本地分支HEAD引用
refs/heads/master
并且不存在 - > “git clone”抱怨不确定是否有任何方法可以直接修改回购邮件中的
HEAD
参考。
(这是你问题的全部要点,我知道;))
也许唯一的方法是"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 :(得分:40)
更新:这仅适用于存储库的本地副本(“客户端”)。请在下面查看其他人的评论。
使用最新版本的git(2014年2月),正确的程序将是:
git remote set-head $REMOTE_NAME $BRANCH
例如,将远程origin
的头部转换为分支develop
将是:
git remote set-head origin develop
答案 2 :(得分:34)
既然你提到GitHub,要在他们的网站上进行,只需进入你的项目,然后......
admin > Default Branch > (choose something)
完成。
答案 3 :(得分:11)
请参阅:http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
这将设置git存储库中的默认分支。您可以在裸存储库或镜像存储库中运行它。
用法:
$ git symbolic-ref HEAD refs/heads/<branch name>
答案 4 :(得分:9)
(基本上已经存在基本相同的问题“create a git symbolic ref in remote repository”,但没有得到普遍回答。)
但是对于各种git“farm”有一个特定的答案(多个用户可以通过受限制的界面管理git repos:通过http和ssh):http://Github.com,http://Gitorious.org,{{3} },http://repo.or.cz(Girar)。
这些具体答案可能对阅读本页并考虑这些特定服务的人有用。
$ 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更改为指向sisyphus
分支。答案 5 :(得分:7)
如果您可以从shell访问远程仓库,只需进入.git(或主目录,如果它是一个裸仓)并更改HEAD文件以指向正确的头。例如,默认情况下它总是包含'refs:refs / heads / master',但是如果你需要foo作为HEAD,只需编辑HEAD文件并将内容更改为'refs:refs / heads / foo'。 / p>
答案 6 :(得分:5)
您只需使用瓷器Git命令即可创建分离的主分支:
git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"
这给了我们一个带有粗鲁消息的主分支(你可能想要更礼貌)。现在我们创建我们的“真正”分支(让我们称之为 trunk 以纪念SVN)并将其与 master 离婚:
git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"
嘿,presto! gitk --all 会显示主和主干,但它们之间没有任何关联。
这里的“神奇”是 - 修改导致 git commit 创建一个与当前HEAD具有相同父级的新提交,然后让HEAD指向它。但是当前的HEAD没有父级,因为它是存储库中的初始提交,因此新的HEAD也没有得到它,使它们彼此分离。
旧的HEAD提交不会被 git-gc 删除,因为refs / heads / master仍然指向它。
仅需要 - allow-empty 标志,因为我们提交的是空树。如果在 git rm 之后有一些 git add ,则没有必要。
实际上,您可以随时通过在存储库中分支初始提交,删除其树,添加分离的树,然后执行 git commit --amend 来创建分离的分支。
我知道这并没有回答如何修改远程存储库上的默认分支的问题,但它提供了关于如何创建分离分支的简洁答案。
答案 7 :(得分:2)
首先,创建您想要设置为默认值的新分支,例如:
$>git branch main
接下来,将该分支推送到 origin :
$>git push origin main
现在,当您登录GitHub帐户时,可以转到存储库并选择设置&gt;默认分支,然后选择“主”。
然后,如果您这样选择,则可以删除主分支:
$>git push origin :master
答案 8 :(得分:0)
对于gitolite人,gitolite支持一个名为 - wait for it - symbolic-ref
的命令。如果您拥有对repo的W(写入)权限,它允许您远程运行该命令。
答案 9 :(得分:0)
关于这个问题,我在搜索时到这里结束了
如何使本地存储库知道GitHub上默认的分支已更改
为完整起见,请添加答案:
git remote set-head origin -a
答案 10 :(得分:-1)
只需登录您的GitHub帐户,然后在导航菜单的最右侧选择设置,在设置标签中选择默认分支并返回到您的存储库的主页面,为我做了诀窍。