Hi all, following from a discussion in IRC freenode #git between me, sitaram an shruggar step to reproduce: $ mkdir /tmp/gitbug $ cd /tmp/gitbug/ $ # create a fake remote repo $ git init --bare remote.git $ # clone it with the user that will generate the bug $ git clone remote.git buggenerator $ cd buggenerator/ $ touch whatever $ git add . $ git commit -m "first commit" $ git push origin master $ # now clone the same repo the other guy is the "victim" of this issue $ cd .. $ git clone remote.git victim $ # time to create the remote HEAD branch $ cd buggenerator/ $ git push origin HEAD:HEAD $ # the remote refs has been created! $ git ls-remote $ # another commit $ echo 'any change' >> whatever $ git commit -a -m "some change" $ git push origin master $ # the refs/heads/HEAD is still where it was $ git ls-remote $ # now from the victim perspective $ cd ../victim/ $ # every time executing a fetch he will get a force update $ # or maybe even an error, seen it my real repo, don't know how $ # to reproduce $ git fetch $ git fetch $ git ls-remote $ git fetch $ git ls-remote $ git branch -a full console log: mastro@mastroc3 ~ $ mkdir /tmp/gitbug mastro@mastroc3 ~ $ cd /tmp/gitbug/ mastro@mastroc3 /tmp/gitbug $ git init --bare remote.git Initialized empty Git repository in /tmp/gitbug/remote.git/ mastro@mastroc3 /tmp/gitbug $ git clone remote.git buggenerator Cloning into buggenerator... done. warning: You appear to have cloned an empty repository. mastro@mastroc3 /tmp/gitbug $ cd buggenerator/ mastro@mastroc3 /tmp/gitbug/buggenerator (master #) $ touch whatever mastro@mastroc3 /tmp/gitbug/buggenerator (master #) $ git add . mastro@mastroc3 /tmp/gitbug/buggenerator (master #) $ git commit -m "first commit" [master (root-commit) 11d0a12] first commit 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 whatever mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ git push origin master Counting objects: 3, done. Writing objects: 100% (3/3), 213 bytes, done. Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. To /tmp/gitbug/remote.git * [new branch] master -> master mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ cd .. mastro@mastroc3 /tmp/gitbug $ git clone remote.git victim Cloning into victim... done. mastro@mastroc3 /tmp/gitbug $ cd buggenerator/ # now creating the HEAD remote branch mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ git push origin HEAD:HEAD Total 0 (delta 0), reused 0 (delta 0) To /tmp/gitbug/remote.git * [new branch] HEAD -> HEAD mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ git ls-remote >From /tmp/gitbug/remote.git 11d0a122125e50e78c7aa4aa81a3d6090dba648e HEAD 11d0a122125e50e78c7aa4aa81a3d6090dba648e refs/heads/HEAD <----- shouldn't be there! 11d0a122125e50e78c7aa4aa81a3d6090dba648e refs/heads/master mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ echo 'any change' >> whatever mastro@mastroc3 /tmp/gitbug/buggenerator (master *) $ git commit -a -m "some change" [master 77852ef] some change 1 files changed, 1 insertions(+), 0 deletions(-) mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ git push origin master Counting objects: 5, done. Writing objects: 100% (3/3), 253 bytes, done. Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. To /tmp/gitbug/remote.git 11d0a12..77852ef master -> master mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ git ls-remote >From /tmp/gitbug/remote.git 77852effa972187d60d4c75145198991f1c0f868 HEAD 11d0a122125e50e78c7aa4aa81a3d6090dba648e refs/heads/HEAD 77852effa972187d60d4c75145198991f1c0f868 refs/heads/master mastro@mastroc3 /tmp/gitbug/buggenerator (master) $ cd ../victim/ mastro@mastroc3 /tmp/gitbug/victim (master) $ git fetch remote: Counting objects: 5, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. >From /tmp/gitbug/remote 11d0a12..77852ef master -> origin/master mastro@mastroc3 /tmp/gitbug/victim (master) $ git fetch >From /tmp/gitbug/remote + 77852ef...11d0a12 HEAD -> origin/HEAD (forced update) mastro@mastroc3 /tmp/gitbug/victim (master) $ git fetch >From /tmp/gitbug/remote 11d0a12..77852ef master -> origin/master mastro@mastroc3 /tmp/gitbug/victim (master) $ git ls-remote >From /tmp/gitbug/remote.git 77852effa972187d60d4c75145198991f1c0f868 HEAD 11d0a122125e50e78c7aa4aa81a3d6090dba648e refs/heads/HEAD 77852effa972187d60d4c75145198991f1c0f868 refs/heads/master mastro@mastroc3 /tmp/gitbug/victim (master) $ git fetch >From /tmp/gitbug/remote + 77852ef...11d0a12 HEAD -> origin/HEAD (forced update) mastro@mastroc3 /tmp/gitbug/victim (master) $ git ls-remote >From /tmp/gitbug/remote.git 77852effa972187d60d4c75145198991f1c0f868 HEAD 11d0a122125e50e78c7aa4aa81a3d6090dba648e refs/heads/HEAD 77852effa972187d60d4c75145198991f1c0f868 refs/heads/master mastro@mastroc3 /tmp/gitbug/victim (master) $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master this can be fixed with: git push --delete origin HEAD (or git push origin :HEAD) then git remote prune origin But I think that git shouldn't allow the remote HEAD reference to be created in the first place regards, Daniele -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html