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

时间:2010-07-21 17:15:14

标签: git

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

问题是,如何正确更改 Active Branch ?我可以简单地直接破解repo.git/HEAD文件,但这看起来很讨厌,而且很糟糕。

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

7 个答案:

答案 0 :(得分: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是,如果您可以直接访问远程仓库。

答案 1 :(得分:3)

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

首先通过执行

列出裸存储库中的所有引用
$find ref

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

$git symbolic-ref HEAD

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

$git sumbolic-ref HEAD ref/heads/<my_branch>
是的,它就是它。享受。

答案 2 :(得分:0)

在裸仓库中的git服务器上的瓷器命令git reset --soft <branch_name>呢?它也必须更改HEAD。

答案 3 :(得分:0)

如何正确更改活动分支?

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

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

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

  

〜/ bare_git_repository.git   独立工作树:   / var / www / myappremote

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

git branch version.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.7

成功更改活动分支

$ git分支

大师

  • version.1.7

使用以下命令检查结果

  

ll / var / www / myappremote

希望这会有所帮助

答案 4 :(得分:-1)

此外,如果您无法访问裸存储库,请执行git remote set-head并完成

请参阅此前response

答案 5 :(得分:-3)

我的服务器上还有一个裸仓库,并且能够使用

成功检索文件
git clone //server/repo/directory -b branch_name

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

答案 6 :(得分:-4)

我在应用

之前和之后比较了两个目录

git symbolic-ref HEAD refs/heads/mybranch

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