What are the consequences of using receive.denyCurrentBranch in Git?

后端 未结 6 1194
借酒劲吻你
借酒劲吻你 2020-11-29 20:54

I have a Git repository. I have cloned the repository and can commit my local changes. When I push my changes to the server it works.

As soon as I create a branch, I

6条回答
  •  一整个雨季
    2020-11-29 21:41

    Why Git won't let you push to non-bare repositories

    The original poster says:

    One solution is to run the following command:

    git config receive.denyCurrentBranch ignore
    

    After this it works, but I would like to know why I need to use this option. Is this the only option? What are the consequences of doing this?

    As I point out in my answer to a similar question, since Git version 1.6.2, Git won't let you push to a non-bare repository by default. This is because the git push command only updates the branch and HEAD references on the remote repository. What it doesn't do is also update the working-copy and staging-area in that non-bare remote.

    As a consequence, when you use git status in the remote repo, you'll see that the repo's previous state is still present in the working copy (and staged in the index):

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
            new file:   previous-state.txt
    

    If you look at the error message that you got when you first tried to push to your non-bare remote repo with the receive.denyCurrentBranch setting set to the default refuse value, you'll see that the message tells you basically the same thing:

    error: refusing to update checked out branch: refs/heads/master
    error: By default, updating the current branch in a non-bare repository
    error: is denied, because it will make the index and work tree inconsistent
    error: with what you pushed, and will require 'git reset --hard' to match
    error: the work tree to HEAD.
    error:
    error: You can set 'receive.denyCurrentBranch' configuration variable to
    error: 'ignore' or 'warn' in the remote repository to allow pushing into
    error: its current branch; however, this is not recommended unless you
    error: arranged to update its work tree to match what you pushed in some
    error: other way.
    

    You should really just push to bare Git repositories

    As pointed out in some of the other answers, you shouldn't really be pushing to a non-bare repository, for the reasons I pointed out above, and which Git itself is telling you.

    So like what this answer states, a simple way to convert an existing non-bare repo to a bare one is to simply reclone it as a bare repo:

    git clone --bare old-repo
    

    Or you could try messing around with the core.bare config setting, as detailed in this answer.

提交回复
热议问题