Basically, I just want to use git as sort of a versioned one-way FTP.

I have a local git repo in local/. I want to push it to server:remote/, and I want that afterwards all files are checked out in remote on the server (identically to what it looks locally, assuming I git-added everything)

In other words, I want to reproduce this behaviour from Mercurial:

changegroup.update = hg update && echo updated successfully.

I found tons of tutorials that do this with two separate directories on the server side, but I would prefer to use a single one. Is that possible? When I try it, I get the message, below which I don't really understand.

What would be the best practice to do this? (If necessary, you can assume I never change anything on the server, so --forceing something would not be a problem.)

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
  • I am not sure git is the good tool for your need. By default (and this is the content of your alert message) it will refuse to push to a non bare repository where something is already checked out at the same branch because the act of pushing it like that may mean you loose things (you said: assume nothing was changed on the server, but git can not know that). If you want to stick to this model, like the message says, change your configuration and use ignore. You may have a simpler life anyway using rsync Commented Feb 26, 2018 at 17:00
  • 1
    Also doing things that way means that on FTP you have the whole git history, in the .git subfolder. You may or may not want to restrict that, as by default it would be available from your FTP server. Besides the disk impact. Commented Feb 26, 2018 at 17:01
  • Probably the FTP metaphor wasn't the best one. If I did what it seems you think I do, I'd agree that git is bad for this. But it's some configuration files I want to push to the server, no big files. (And I do explicitly want the history.)
    – Marian
    Commented Feb 28, 2018 at 5:54

2 Answers 2


I want to reproduce this behaviour from Mercurial:

With recent git versions, the setting mentioned in the error message now supports a new value:

    denyCurrentBranch = updateInstead

This should give you exactly the behavior you want.

I found tons of tutorials that do this with two separate directories on the server side

As an alternative, you can still use most of these tutorials, by pushing to a different branch (i.e. not to the currently checked out one, but to something like deploy).

git push origin master:deploy

Now you can use similar (or even the same) post-receive or post-update hooks as if you were pushing to a bare repository. For example, the hook could run git merge --ff-only deploy or even git reset --hard deploy.

  • That's exactly what I wanted, thanks! The first link is great and also explains valid usecases for this. Seems I should have included deploying when searching :)
    – Marian
    Commented Feb 28, 2018 at 6:03

Before first commit into remote repo to avoid error: refusing to update I forced to do:

git config receive.denycurrentbranch ignore

To enable auto checkout it is enought to set

git config receive.denycurrentbranch updateInstead

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .