Yaba!!! Made a couple of changes to a Git clone of my project; tried to push the changes to my remote repository and got the errors below.
phiri@PHRLIG001:~/Projects/saldru$ git push laboratory Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 38.96 KiB, done. Total 4 (delta 1), reused 0 (delta 0) 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'. To lphiri.cs.uct.ac.za:~/Projects/saldru ! [remote rejected] master -> master (branch is currently checked out) error: failed to push some refs to 'lphiri.cs.uct.ac.za:~/Projects/saldru' phiri@PHRLIG001:~/Projects/saldru$
Git status clearly shows that my current working tree is ahead of my remote repository by one commit.
phiri@PHRLIG001:~/Projects/saldru$ git status # On branch master # Your branch is ahead of 'laboratory/master' by 1 commit. # nothing to commit (working directory clean) phiri@PHRLIG001:~/Projects/saldru$
A quick search online reveals that its a very well documented problem with varying solutions [1, 2]. I particularly found the options below helpful and use them in the order they appear. Note that Option #3 is not a recommended best practice, especially if working in a team.
Option #1: Fool Git by using a dummy branch
cd [remote repo]
git check -b [dummy branch name]
Option #2: Create a bare repo
cd [remote repo]
rm -rf *
mv .git/* .
vi config [and change bare option from false to true]
Option #3: Alter receive.denyCurrentBranch configuration variable
cd <remote repo>
git config receive.denyCurrentBranch warn
phiri@PHRLIG001:~/Sandbox/git/repo$ man git config receive.denyCurrentBranch If set to true or "refuse", git-receive-pack will deny a ref update to the currently checked out branch of a non-bare repository. Such a push is potentially dangerous because it brings the HEAD out of sync with the index and working tree. If set to "warn", print a warning of such a push to stderr, but allow the push to proceed. If set to false or "ignore", allow such pushes with no message. Defaults to "refuse".
Please comment if you notice an anomaly or if you know of other ways to solve this problem.
Bibliography
[1] http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked-o
[2] http://sitaramc.github.com/concepts/bare.html#yeah_yeah_but_why_do_I_need_a_bare_repo_