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

kbr*_*bro 185 git

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

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

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

我试过git update-ref HEAD refs/heads/otherbranch但是刚刚更新的refs/heads/master与refs/heads/otherbranch相同(好吧,我在虚拟存储库中做了那个,而不是我的生产!)

我试过git update-ref --no-deref HEAD refs/heads/otherbranch,这几乎奏效了.它更新了HEAD文件,但它将其设置为指向的提交的SHA1 refs/heads/otherbranch.

我正在使用git版本进行测试1.7.0.2.msysgit.0.

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

Von*_*onC 268

如果您可以访问远程裸仓库,本文建议:

git symbolic-ref HEAD refs/heads/mybranch
Run Code Online (Sandbox Code Playgroud)

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

ref: refs/heads/mybranch
Run Code Online (Sandbox Code Playgroud)

如中所述 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是,如果您可以直接访问远程仓库.

  • 谢谢!我确实可以直接访问远程裸仓库,因此git-symbolic-ref可以完成这项工作.我喜欢在另一个线程中提到的无共同祖先技巧 - 但绝对是最底层的抽屉之一.我花了很多年的谷歌搜索,但找不到你以前的答案,但"git remote head master"发现它是排名第二的命中,就在git-remote(1)之下.离奇.只是表明当你不确切地知道你在寻找什么时,找到一些东西是多么困难. (3认同)

小智 9

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

首先通过执行以下操作列出裸存储库中的所有引用

$find ref
Run Code Online (Sandbox Code Playgroud)

然后找到您的分支的参考,格式如下refs/heads/<my_branch>。因此下一步是检查当前参考,只需键入:

$git symbolic-ref HEAD
Run Code Online (Sandbox Code Playgroud)

这样您就知道哪个是当前分支,然后根据需要更新它。

$git symbolic-ref HEAD refs/heads/<my_branch>
Run Code Online (Sandbox Code Playgroud)

就是这样。享受。