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


195

我有一个裸仓库,用作我的项目的中央存储。所有开发人员都git clone <repo>愿意与它分享。当他们进行克隆时,git clone -n由于repo.git/HEAD包含ref: refs/heads/master,他们将获得master分支的签出(除非这样做),从而使之成为Active Branch

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

我尝试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,因为允许所有人和其他人更改您的默认分支似乎有些不安全(!),但是肯定有.git比直接修改HEAD文件更好的方法在repo 目录中。


IMO,您只是从根本上尝试在这里做错事。如果您希望默认分支不是master,则该分支需要是master。或者,使用两个不同的存储库。
尼古拉斯·奈特

12
从根本上来说,这是怎么做的呢?裸存储库支持多个分支。我使用裸存储库作为本地存储库的备份,并因此反映了分支机构。我在这两个方面都有一个硕士,在这两个方面都有一个开发部门。如果我想在裸存储库上查看开发分支的日志,我必须破解文件-似乎git在裸存储库支持方面根本上是错误的。
Cthutu 2011年

15
@NicholasKnight恕我直言,您在这里根本上是错误的。“ master”作为分支名称没有什么特别的,这只是默认设置。在维护的存储库中,我们没有master分支,因为“ master”对公司没有意义。每当我们发布时,我们都会使用新的发布编号创建一个新的维护分支,并将其分配为活动分支。
Spacemoose 2014年

@NicholasKnight当我感谢您的来历时,这是第一个告诉我如何转换大师的SO Q / A !进行裸克隆时,我在功能分支上拥有了最初的存储库,而从该裸存储库中获得的后续克隆都默认为该分支而不是主服务器。
Warbo

1
哇-这个问题不胜枚举-这是我排名第一的得分手!关于“ master”的事情是,它只是一个名字,如果它对您的组织,团队,项目,阶段等等没有意义,那么请选择合适的内容,以便当您的协作者克隆您的存储库时,他们会立即切换到您作为配置管理器希望其启用的分支。我以前使用过ClearCase(bletch!),所以您选择的是“ main”,“ main”或“ main”。Yu
kbro

Answers:


279

如果您有权访问远程裸仓库,则本文建议您

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


3
谢谢!我确实可以直接访问远程裸仓库,所以git-symbolic-ref可以完成工作。不过,我喜欢另一条线索中提到的罕见祖先把戏-绝对是最底层的抽屉。我花了很多年的时间来谷歌搜索,但是找不到您以前的答案,但是“ git remote head master”将其视为排名第二的热门歌曲,仅次于git-remote(1)。奇怪 只是说明在不知道要查找的内容时很难找到东西。
kbro

git symbolic-ref HEAD refs/heads/mybranch对我来说工作很好!谢谢!;)
vinzenzweber 2012年

1
我真的很感谢这个问题,因为我不小心签出了一个不同于 master的分支,而现在我不得不解决这个问题。
Jonny Best,

这对我不起作用。奇怪的是,即使裸仓库中的远程HEAD现在显示了正确的分支,当我从它克隆时,git STILL也会默认将我设置为另一个分支!
Magnus 2014年

@Magnus本身就是一个在新页面中提出的好问题。
VonC 2014年

3

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

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

$find ref

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

$git symbolic-ref HEAD

因此您知道哪个是当前分支,然后根据需要对其进行更新。

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

就是这样。请享用。


2

如何正确更改活动分支?

  • 状态:repo .git目录中的git checkout返回致命信息:此操作必须在工作树中运行

  • 提示:只需添加--work-tree参数

详细的示例:假设:远程服务器上的裸git:

〜/ bare_git_repository.git分离的工作树:/ var / www / myappremote

在本地服务器上: 创建分支version.1.7(我们的其他分支)

git分支版本1.7

git push原始版本1.7

在带有git raw repo的远程服务器上:

$ cd〜/ bare_git_repository.git

$ git分支


  • 版本1.7

如前所述,以下命令

git checkout version.1.7

返回

致命的:此操作必须在工作树中运行

使用以下命令

git --work-tree = / var / www / myappremote结帐版本1。

成功地成功更改活动分支

$ git分支

  • 版本1.7

用以下方法检查结果

ll / var / www / myappremote

希望对你有帮助


这个非常简单的解决方案对我有用,谢谢!注意事项:为了使命令成功执行,我必须手动创建一个空的工作树目录。
乔尔Esponde

-1

另外,如果您无权访问裸存储库,则通过执行a git remote set-head即可完成

看到之前的回复


-3

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

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

即使手册页上说这仅适用于非裸存储库,也可以将其存储到新的本地存储库中。


1
尽管您说的是正确的,但实际上您正在使用-b选择特定分支,这在我的问题上下文中打断了您的答案,即如何设置DEFAULT分支。
kbro

-4

我比较了申请前后的两个目录

git symbolic-ref HEAD refs/heads/mybranch

而且似乎只更改了repo.git / HEAD文件,因此仅“ hack”该文件可能很安全。


2
通过直接编辑Git ref文件,可以引入一些细微的中断问题。我强烈建议您反对。管道命令比直接编辑引用更容易,更安全。
Alain O'Dea

2
@boryn的优点是什么?
Alex Chamberlain 2012年

2
Git在后台跟踪许多事物,例如历史记录。如果您手动更改文件,则将不会记录该文件。的确,这可能无关紧要。但是,如果您丢失了一些提交并希望找到它们,那么,如果您不只是“黑客”该文件,那么您会更快乐。
qwerty9967

我使用了命令。但是这个答案有助于理解它的工作原理,特别是有助于理解refs / heads是内部的东西,我不应该更改它,而只是“路径”的最后一部分。因此,我投票赞成,因为我认为毕竟这是有价值的信息。
Mike Keskinov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.