【问题标题】:Git bare repository has master branch checked out?Git裸存储库已签出主分支?
【发布时间】:2013-02-15 22:39:29
【问题描述】:

我很确定以前有人问过这个问题,但我似乎没有找到它。很抱歉,如果它是重复的。

我有一个裸存储库,如果我们检查它说的配置文件,我们可以称之为 project_x.git

[core]
repositoryformatversion = 0
filemode = false
bare = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly

所以它是绝对正确的,bare=true。现在我正在尝试用清理版本替换 master 。

$ git push origin :master
remote: Updating references: 100% (1/1)
To http://gitrepo.local/git/project_x.git
! [remote rejected] master (branch is currently checked out)
error: failed to push some refs to 'http://gitrepo.local/git/project_x.git'

我正在使用 gitblit 顺便说一句,这不是实际的服务器 url。

这个回复让我很困惑,我怎么能在我的裸仓库上拥有一个结帐分支?谁在那个分支上工作:),没有意义。要么配置明智,要么 gitblit 惹恼了我。没看懂?

怎么了?

顺便说一句,如果我尝试了同样的消息

git push -f , 

编辑:这可行,但您不能像我之前尝试的那样删除分支。

谢谢

【问题讨论】:

    标签: git git-remote git-bare git-config


    【解决方案1】:

    似乎您的本地存储库正在/正在跟踪远程源/主分支。你已经检查了本地主人。

    git push origin :master
    

    ... 表示您正在删除远程跟踪分支,但是当您在本地签出相同的分支时会失败。我认为您必须签出另一个本地分支才能删除远程分支。

    如果你想用远程裸存储库“重新开始”,我会(在远程存储库上)做一个新的

    git init --bare
    

    ... 然后将您的本地主机推送到该位置,然后将其设置为上游。

    git push origin master -u
    

    【讨论】:

    • 实际上,当我收到远程拒绝时,我正在清理分支上。我知道我最初创建裸仓库的方式。我认为即使您在本地的跟踪分支上也可以删除远程...我会尝试并让您知道。谢谢
    【解决方案2】:

    在裸 repo 上有一个 HEAD 集,它实际上指向当你运行 git clone <url> 时签出的分支。

    据我所知,你不能删除远程 HEAD 分支,所以如果你想删除 master,你必须推送第二个分支,将你的 HEAD 移动到那个分支,然后在 master 中推送一个空分支:

    本地:

    git branch mybranch
    git push origin mybranch
    

    在裸仓库上:

    git symbolic-ref HEAD refs/heads/mybranch
    

    本地:

    git push origin :master
    

    当然,如果需要,您可以推送另一个名为 master 的分支,并将 HEAD 移回它。

    git push origin newbranch:master
    git symbolic-ref HEAD refs/heads/master #(on bare repo)
    

    【讨论】:

    • 很好的解释,我从来没有必要在我的远程服务器上做如此暴力的行为,但是 maven release 用 maven-release 提交把它搞砸了,在交互式 rebase 之后,我在尝试重写历史时发现了这个问题。无论如何,多亏了你,我又回到了正轨。