We make heavy use of puppet environments in our workflow. Using r10k, git branches are magically mapped to environments. This allows a process where anyone one the team can individually work on a new feature or change, and then we can collaborate and review/revise/test in a controlled manner. We can rebase to the production branch, and use the diff output as part of our change-management documentation. Once the change is merged, however, sometimes the original branch is not deleted.

In doing a puppet-server migration, I decided to clean up some of these “forgotten” branches. Not all branches end up being merged, though; sometimes we will prove out a change, decide not to implement it in production, but want to keep it for future reference. Or, maybe the change is still a work in progress.

To list the remote branches that have already been merged (into the production branch):

$ git branch -r --merged production
  remotes/origin/HEAD -> origin/production
  remotes/origin/new_feature_foo
  remotes/origin/another_change_bar

These can be deleted. I can never remember the syntax for deleting a remote branch, so I use a nuke alias that deletes both the local and remote branches:

$ git config --get alias.nuke
!sh -c 'git branch -D $1 && git push origin :$1' -
$ git nuke new_feature_foo
Deleted branch new_feature_foo (was 0b43193).
remote: Deploying to puppetmaster.
remote: r10k new_feature_foo environment removed, will be purged on next run.
remote: Sending notifications.
remote: Mirroring to GitHub.
remote: To git@github.com:/bowdoincollege/noc-puppet
remote:  - [deleted]         new_feature_foo
To git.bowdoin.edu:/noc/puppet.git
 - [deleted]         new_feature_foo

Alternatively, you may want to see all branches that have not been merged (yet) into the production branch:

$ git branch -a --no-merged production
  rejected_feature
  work_in_progress
  production
  remotes/origin/HEAD -> origin/production
  remotes/origin/rejected_feature
  remotes/origin/work_in_progress

I took a look at these and cleaned up what I could, but there were a few from other team members that I didn’t know about. I asked everyone to take a look and clean up any unneeded branches/environments. After they had deleted the remote branches, I was able to clean up my local repository:

$ git remote prune origin
Pruning origin
URL: git@git.bowdoin.edu:/noc/puppet.git
 * [pruned] origin/arubaguestportal
 * [pruned] origin/freeradius_arubalab
 * [pruned] origin/freeradius_nopersontype
 * [pruned] origin/opsview_mitsubishiups
 * [pruned] origin/wlcforrancid

This deletes (prunes) any local tracking branches that no longer exist on the remote.