Git:正确的方式来改变裸仓库中的活动分支?

我有一个裸仓库,用作我的项目的中央商店。 所有的开发人员都做git clone <repo>与它共享。 当他们做的克隆,他们得到一个主分支(除非他们做git clone -n )的结帐,因为repo.git/HEAD包含ref: refs/heads/master ,使这个活动分支

问题是,如何正确地更改活动分支 ? 我可以直接破解repo.git/HEAD文件,但是这看起来很讨厌,而且很好用。

我尝试在repo .git目录中执行git checkout <otherbranch> ,但失败了,因为我不在工作树中。

我试过git update-ref HEAD refs/heads/otherbranch但是只是更新了refs / heads / master与refs / heads / otherbranch相同(好吧,我在一个虚拟库中做了一个,而不是我的产品)。

我试过git update-ref --no-deref HEAD refs/heads/otherbranch ,而且几乎可以工作。 它更新了HEAD文件,但将其设置为由refs/heads/otherbranch指向的提交的SHA1。

我正在使用git 1.7.0.2.msysgit.0进行testing。

我猜是没有办法做到这一点通过git push ,因为允许所有和各式各样的改变你的默认分支似乎有点不安全(!),但当然有一个更好的办法,在repo .git目录中,而不是直接黑客HEAD文件。

如果您有权访问远程裸回购, 本文build议 :

 git symbolic-ref HEAD refs/heads/mybranch 

这将更新您的存储库中的HEAD文件,以便它包含:

 ref: refs/heads/mybranch 

git-symbolic-ref


如果你没有访问远程回购,请参阅我以前的答案 。


记住像git remote set-head这样的命令:

  • 不会更改远程回购的默认分支。
    它只会将存储在本地仓库中的远程跟踪分支更改为refs/remotes/<name>/HEAD

  • 不会改变HEAD本身(同样,只有refs/remotes/<name>/HEAD ),因此需要git symbolic-ref

所以git remote set-head 不是这里的答案。
git symbolic-ref HEAD是,如果你有直接访问远程回购。

要更改分支,您需要将HEAD引用更改为您要使用的分支。

首先列出裸仓库中的所有引用,通过执行$ find ref然后find您的分支的引用,格式将如下refs / heads /。 所以下一步是检查当前引用,只需input:$ git symbolic-ref HEAD,这样你就知道当前分支是哪个,然后根据需要进行更新。 $ git sumbolic-ref HEAD ref / heads /

Thant的。 请享用。

另外,如果你没有访问裸仓库,通过做一个git remote set-head ,你就完成了

看到此前的回应

我也有一个裸露的回购在我们的服务器,并能够成功地检索文件使用

 git clone //server/repo/directory -b branch_name 

到一个新的本地存储库,即使该手册说这只适用于非裸存储库。

我应用前后比较了两个目录

git symbolic-ref HEAD refs/heads/mybranch

看来只有repo.git / HEAD文件被改变了,所以可能只是“破解”文件是相当安全的。