This doesn't work in an ancient, non-bare repository if master is checked out and master is also fetch: git refuses to overwrite the local ref unless we pass --update-head-ok. Pass this flag.
Also, remove some code which examines branches and tags in a special way for non-bare working copies. The old git fetch <origin> code without explicit revsets meant that refs/remotes/orgin/heads/xyz got updated instead of refs/heads/xyz. We now update our local refs in all cases (bare and non-bare) so we can throw away this special casing.