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文件被改变了,所以可能只是“破解”文件是相当安全的。