Question

I have a local repository that I want to mirror to the remote 'websrv'. This used to work fine until I deleted a local branch. Now when I do

git push --mirror websrv

I get

remote: error: By default, deleting the current branch is denied, because the next
remote: error: 'git clone' won't result in any file checked out, causing confusion.
remote: error: 
remote: error: You can set 'receive.denyDeleteCurrent' configuration variable to
remote: error: 'warn' or 'ignore' in the remote repository to allow deleting the
remote: error: current branch, with or without a warning message.
remote: error: 
remote: error: To squelch this message, you can set it to 'refuse'.
remote: error: refusing to delete the current branch: refs/heads/ecoli-moments
To git@141.89.117.199:~/baki_tracking.git
 ! [remote rejected] ecoli-moments (deletion of the current branch prohibited)

The branch 'ecoli-moments' points to the same commit as master, local and remote.

What can I do about this so that the remote branch will be properly deleted?

Update:

The remote repository is bare, I checked the directory on the server (the config file has bare=true).

Was it helpful?

Solution

Even a bare repository has a current branch. It is the one that will be checked out by default when you clone the repository. Git does not want to delete it and is telling you why.

The default branch is the special HEAD reference. Modify it to point to something that is expected to always exist, or to point to a revision. See also How does origin/HEAD get set?.

You'll have to change what HEAD points to manually using git symbolic-ref(1) on the server.

Or you can set the option mentioned in the error to false (git config receive.denyDeleteCurrent false on the server); if it's just a backup (--mirror is mostly appropriate only for backup), the default branch does not really matter.

OTHER TIPS

This seems to be a non bare repository. If that is the case, any push operation to the checked out branch on non bare repo will not work, git doesn't allow that.

So you essentially need to check out a different branch and then push to the repo.

From Jan's comment, A useful method is to check no branch at all, that is go to the state known as detached HEAD where the HEAD ref points to specific revision rather than to a branch.

The advantage of this is that if you make more commits to different branches in future, you don't have to check out different branch every time this error is thrown.

A better way to avoid this though, if you are doing this for backups only, is to use a bare repo next time onwards.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top