Skip to content

Instantly share code, notes, and snippets.

@VeryCB
Last active October 3, 2020 07:59
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save VeryCB/6759219 to your computer and use it in GitHub Desktop.
Save VeryCB/6759219 to your computer and use it in GitHub Desktop.
This script helps removing Git branches. Run it from a git repo dir. It will open the Git branches list in your favorite editor. Delete some branches from the list. Save and close the file. The script applies the changes to the repo.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This script helps removing Git branches.
# Run it from a git repo dir. It will open the Git branches list
# in your favorite editor. Delete some branches from the list.
# Save and close the file. The script applies the changes to the repo.
from subprocess import call, Popen, PIPE
from os import getenv
import re
# configure commands used in this script
editor_command = getenv('EDITOR')
branch_command = 'git branch -a'
mktemp_command = 'mktemp'
def is_remote(branch):
return branch.startswith('remotes/')
# takes 'git branch' output and returns a set of branches
def branches_to_list(text):
branches = set()
for branch in re.split('\n', text):
branch = re.sub(' .+', '', branch.lstrip());
if branch is not '':
branches.add(branch)
return branches
# create a temp file
tmp_file = Popen(mktemp_command, stdout=PIPE).communicate()[0].decode().rstrip()
# write git branches to the temp file
call('%s > %s' % (branch_command, tmp_file), shell=True)
# get original branches
original_branches = branches_to_list(open(tmp_file, 'r').read())
# edit the temp file with the editor command
call('%s %s' % (editor_command, tmp_file), shell=True)
# get new branches
new_branches = branches_to_list(open(tmp_file, 'r').read())
# adding and renaming branches is not supported
if(new_branches.difference(original_branches)):
exit('Aborting! Do not add or rename branches, just remove them.')
# remove branches with Git
for branch in original_branches.difference(new_branches):
if is_remote(branch):
branch = branch.lstrip('remotes/')
pushable = re.sub('/', ' :', branch)
call('git push %s' % pushable, shell=True)
else:
call('git branch -D %s' % branch, shell=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment