Remove local git tags that are no longer on the remote repository
This is great question, I'd been wondering the same thing.
I didn't want to write a script so sought a different solution. The key is discovering that you can delete a tag locally, then use git fetch to "get it back" from the remote server. If the tag doesn't exist on the remote, then it will remain deleted.
Thus you need to type two lines in order:
git tag -l | xargs git tag -d
git fetch --tags
These:
Delete all tags from the local repo. FWIW, xargs places each tag output by "tag -l" onto the command line for "tag -d". Without this, git won't delete anything because it doesn't read stdin (silly git).
Fetch all active tags from the remote repo.
This even works a treat on Windows.
From Git v1.7.8 to v1.8.5.6, you can use this:
git fetch <remote> --prune --tags
Update
This doesn't work on newer versions of git (starting with v1.9.0) because of commit e66ef7ae6f31f2. I don't really want to delete it though since it did work for some people.
As suggested by "Chad Juliano", with all Git version since v1.7.8, you can use the following command:
git fetch --prune <remote> +refs/tags/*:refs/tags/*
You may need to enclose the tags part with quotes (on Windows for example) to avoid wildcard expansion:
git fetch --prune <remote> "+refs/tags/*:refs/tags/*"
If you only want those tags which exist on the remote, simply delete all your local tags:
$ git tag -d $(git tag)
And then fetch all the remote tags:
$ git fetch --tags