Skip to content

Instantly share code, notes, and snippets.

@newthinker
Forked from rlivsey/git-prune-tags.rb
Created December 18, 2015 02:14
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save newthinker/8c2ab607393307761e61 to your computer and use it in GitHub Desktop.
Script to prune any tags which exist locally but not on the remote
#!/usr/bin/env ruby
require 'readline'
def prompt(prompt="> ")
input = nil
prompt += " " unless prompt =~ /\s$/
loop do
input = Readline.readline(prompt)
break if input.length > 0
end
return input
end
remote = ARGV[0]
dry_run = ARGV.include?("--dry-run")
if !remote || remote == "--dry-run"
puts "no remote specified, assuming 'origin'"
remote = "origin"
end
local_tags = `git tag`.split("\n")
remote_tags = []
remote_tag_details = `git ls-remote --tags #{remote}`.split("\n")
remote_tag_details.each do |details|
sha, tag = details.split("\t")
next if tag[-3, 3] == "^{}"
remote_tags << tag.gsub(%r(^refs/tags/), '')
end
delete_tags = []
local_tags.each do |local_tag|
next if remote_tags.include?(local_tag)
puts "local tag '#{local_tag}' not found in '#{remote}'"
delete_tags << local_tag
end
if delete_tags.empty?
abort "No tags found locally which aren't on '#{remote}'"
end
if dry_run
puts "#{delete_tags.size} tags would have been deleted, run without --dry-run to do the deed"
else
response = prompt("Are you sure you want to delete these tags? (yn)")
if response.downcase.strip =~ /^y/
delete_tags.each do |local_tag|
`git tag -d #{local_tag}`
end
puts "#{delete_tags.size} tags have been deleted"
else
puts "Aborted"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment