It's not a folder that exists, it's a branch. (Well, there may be a folder/directory involved somewhere—or maybe not, as references get "packed" and stop existing as files within directories.)
b
exists, no branch named b/anything
can be created. dev/b
exists, dev/b/c
cannot be created.This is a git internal limitation. In this particular case, remote origin
has a branch named dev/sub
(regardless of whether you have it or not, the important thing is whether the remote has it). In order to create, on origin
, a branch named dev/sub/master
, you must first delete the branch named dev/sub
on origin
:
git push origin :dev/sub
(Of course, deleting this branch may delete something important over there, so be sure you know what you are doing. Generally, you might want to git fetch origin
first, capturing their dev/sub
as your origin/dev/sub
. You can then make a local branch named dev/renamed-sub
pointing to the same commit, create dev/renamed-sub
on the remote, delete the remote dev/sub
, and then create dev/sub/master
on the remote.)
If you can log in on the remote (the system that origin
is hosted on), you can go into the repository over there and simply rename the local dev/sub
branch. (Based on comments below, I suspect that there's a broken auto-deploy script over there as well, which probably should be fixed to only deploy "deployable" branches, rather than everything that gets pushed. But I am just guessing here.)
I was in a state when I couldn't even fetch because my repo had info about non-existing remote branches I didn't even had checked out. I solved it by running combination (thanks @torek) of:
git branch -r
list local copies of remote branchesgit ls-remote
list remote branchesgit fetch --prune origin
update local copies of remote branches (this actually didn't help me)git remote prune origin
remove info about removed remote branches (this did)For me -->
Error =
fatal: cannot lock ref 'refs/heads/release/wl/2.3': 'refs/heads/release/wl'
exists; cannot create 'refs/heads/release/wl/2.3'
Solution =
$~ git update-ref -d refs/heads/release/wl
$~ git checkout release/wl/2.3
The currently accepted answer didn't help me because I didn't have a ref on the remote repo to delete - it was purely on my local! So if you're in that situation, here's what to do:
This is the issue I was facing:
$ git fetch origin
error: cannot lock ref 'refs/remotes/origin/fix/sub-branch':
'refs/remotes/origin/fix' exists; cannot create
'refs/remotes/origin/fix/sub-branch'
From <repo URL>
! [new branch] fix/sub-branch -> origin/fix/sub-branch
(unable to update local ref)
I tried the accepted answer's suggestion but got this:
$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>
So the ref didn't even exist on origin
- it was clearly just hanging around somewhere on my local repo. So I ran $ git remote show me
, which produced:
Remote branches:
...
refs/remotes/origin/fix stale (use 'git remote prune' to remove)
...
Which then made the solution clear:
$ git remote prune origin
Pruning origin
URL: <redacted>
* [pruned] origin/fix
With this, the problem disappeared:
$ git fetch origin
remote: Counting objects: 5, done.
remote: Total 5 (delta 2), reused 2 (delta 2), pack-reused 3
Unpacking objects: 100% (5/5), done.
From <repo URL>
* [new branch] fix/sub-branch -> origin/fix/sub-branch
Try this command to fix it:
git gc
to run a number of housekeeping tasks within the current repository and remove unreachable objects (by invoking git prune
and git fsck --unreachable
).
Read more: git help gc
and git help prune
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With