Git:在裸存储库中更改Active Branch的正确方法?

问题描述 投票:180回答:6

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

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

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

我尝试了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进行测试。

我猜测没有办法通过git push做到这一点,因为允许所有和各种更改你的默认分支似乎有点不安全(!),但肯定有一个更好的方法在repo .git目录中比直接黑客攻击HEAD文件。

git
6个回答
259
投票

如果你有权访问远程裸仓库,这个article suggests

git symbolic-ref HEAD refs/heads/mybranch

这将更新存储库中的HEAD文件,使其包含:

ref: refs/heads/mybranch

git-symbolic-ref中所述


如果您无法访问远程仓库,请参阅my previous answer


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

  • 不会更改远程仓库的默认分支。 它只会将存储在本地仓库中的远程跟踪分支更改为refs/remotes/<name>/HEAD
  • 不会改变HEAD本身(再次,只有refs/remotes/<name>/HEAD),因此需要git symbolic-ref

所以git remote set-head不是这里的答案。 git symbolic-ref HEAD是,如果您可以直接访问远程仓库。


3
投票

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

首先列出裸存储库中的所有引用

$find ref

然后找到你的分支的参考,格式将如下refs/heads/<my_branch>。所以下一步是检查当前参考,只需输入:

$git symbolic-ref HEAD

所以你知道哪个是当前分支然后根据需要更新它。

$git sumbolic-ref HEAD ref/heads/<my_branch>

而已。请享用。


0
投票

那个瓷器命令git reset --soft <branch_name>在裸存储库里面的git服务器上怎么样?它也必须改变HEAD。


-1
投票

此外,如果您无法访问裸存储库,那么通过执行git remote set-head就可以了

看到这个以前的response


-3
投票

我在我们的服务器上也有一个裸仓库,并且能够使用成功检索文件

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

进入一个新的本地存储库,即使该联机帮助页说这只适用于非裸存储库。


-4
投票

我在申请之前和之后比较了两个目录

git symbolic-ref HEAD refs/heads/mybranch

并且似乎只有repo.git / HEAD文件被更改,所以可能只是“破解”文件是非常安全的。

© www.soinside.com 2019 - 2024. All rights reserved.