Jqw
Jqw

Reputation: 1201

git delete remotes: remote refs do not exist

In short;

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;

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.

Upvotes: 119

Views: 54258

Answers (3)

kost
kost

Reputation: 730

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 {}

Upvotes: 15

Mykola Gurov
Mykola Gurov

Reputation: 8695

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

Upvotes: 113

Igor
Igor

Reputation: 33983

You may need to prune your local "cache" of remote branches first. Try running:

git fetch -p origin

before deleting.

Upvotes: 245

Related Questions