git delete remotes: remote refs do not exist
In short;
- How can I delete remote multiple merged remotes?
More background;
I have a git repo with tens of remotes which have been merged into master. I can delete these remotes one at a time by using:
git push --delete origin myBranch-1234
However this is a slow and tedious process for all remotes. So I'm trying this command:
git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete
git branch -r --merged
lists all merged remotes.grep origin
tells the command to include origin.grep -v master
tells the command to exclude master.xargs git push origin --delete
tells the command to delete the list of remotes.
All together, I expect this to gather all merged remotes and delete them.
When I run the above command, I receive the following for every merged remote;
error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc
However these remotes do exist and I can checkout each of them. Many sites and people recommend that I run git fetch --prune
to clean up missing references. This does nothing because all of these remotes exist.
So I ask you, dear stack exchange;
- Why can I delete one remote, but not many?
- Is my command correct?
I think I'm missing something small. Every time I research this, it seems like I'm doing this correctly, but I'm getting the above errors.
- Delete local and Remote Branches
- gist Delete Merged Remotes
Solution 1:
You may need to prune your local "cache" of remote branches first. Try running:
git fetch -p origin
before deleting.
Solution 2:
Are those branches removed from the remote (origin)? If yes, you can simply do
git fetch --prune origin
Otherwise they might return even after you delete them locally.
Update: Looking at your command again, it looks like you're building it incorrectly. You probably want
git push origin --delete myBranch-1234
but instead you are doing something like
git push origin --delete origin/myBranch-1234
Solution 3:
Use sed
to remove 'origin/' part and change a lttile xargs
part.
git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// | xargs -I{} git push origin --delete {}