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

问题是,如何正确地更改活动分支?我可以简单地黑进回购系统。git/HEAD文件直接,但这似乎令人讨厌,嗯,hack。

我尝试在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。

我猜通过git push没有办法做到这一点,因为允许所有人改变你的默认分支似乎有点不安全(!),但可以肯定的是,在repo .git目录中有更好的方法来做到这一点,而不是直接破解HEAD文件。


当前回答

如何正确地更改活动分支?

状态: 在repo .git目录下的Git签出 返回 fatal:此操作必须在工作树中运行 小贴士: 只需添加——work-tree参数

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

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

在本地服务器: 创建分支版本。1.7(我们的另一个分支)

Git分支版本。1.7

Git推送原始版本。1.7

在远程服务器上使用git裸回购:

$ CD ~/bare_git_repository.git

给我报应

主 version.1.7

如前所述,下面的命令

Git结帐版本。1.7

返回

fatal:此操作必须在工作树中运行

使用以下命令

Git——work-tree=/var/www/myappremote checkout version.1.7

成功地正确更改活动分支

给我报应

version.1.7

用下面的方法检查结果

2 / var / www / myappremote

希望对大家有所帮助

其他回答

如何正确地更改活动分支?

状态: 在repo .git目录下的Git签出 返回 fatal:此操作必须在工作树中运行 小贴士: 只需添加——work-tree参数

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

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

在本地服务器: 创建分支版本。1.7(我们的另一个分支)

Git分支版本。1.7

Git推送原始版本。1.7

在远程服务器上使用git裸回购:

$ CD ~/bare_git_repository.git

给我报应

主 version.1.7

如前所述,下面的命令

Git结帐版本。1.7

返回

fatal:此操作必须在工作树中运行

使用以下命令

Git——work-tree=/var/www/myappremote checkout version.1.7

成功地正确更改活动分支

给我报应

version.1.7

用下面的方法检查结果

2 / var / www / myappremote

希望对大家有所帮助

至少在v.2.35.3, git symbol -ref HEAD refs/heads/otherbranch不再生成文件refs/heads/otherbranch。相反,它会被默默地添加到.pack -refs中,如果没有提交,则添加到HEAD中。git symbol -ref HEAD将从所有对象中静默报告。

参见git帮助包参考

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

git symbolic-ref HEAD refs/heads/mybranch

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

ref: refs/heads/mybranch

详见git-symbolic-ref


如果您无法访问远程回购,请参阅我以前的回答。


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

不更改远程回购的默认分支。 它只更改存储在本地repo中的一个远程跟踪分支,如refs/remotes/<name>/HEAD 不会改变HEAD本身(同样,只改变refs/remotes/<name>/HEAD),因此需要 git symbolic-ref。

所以git remote set-head不是这里的答案。 git symbol -ref HEAD是,如果你可以直接访问远程repo。

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

首先,通过下面的操作列出裸存储库中的所有引用

$find ref

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

$git symbolic-ref HEAD

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

$git symbolic-ref HEAD refs/heads/<my_branch>

就是这样。享受。

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

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

到一个新的本地存储库,尽管手册上说这只适用于非裸存储库。