Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git-svn: Bulk removing orphaned remote branches

Tags:

git

git-svn

A project in SVN I'm working on (via git-svn) has frequently-created branches that are then --reintegrated with trunk, and then deleted.

Right now the project has about 10 branches that have not been deleted, but in git, git branch -r shows about 50.

I can remove these one at a time, checking whether they still exist in the svn repository but it's slow and tedious. Is there a way to sync my list of git remote branches with the svn repo?

like image 903
Billiam Avatar asked May 06 '11 17:05

Billiam


People also ask

Does git prune affect remote?

No git remote prune origin will only delete the refs to remote branches that no longer exist. Git stores both local and remote refs. A repository will have local/origin and remote/origin ref collections.

What is git branch command?

The git branch command lets you create, list, rename, and delete branches. It doesn't let you switch between branches or put a forked history back together again. For this reason, git branch is tightly integrated with the git checkout and git merge commands.


1 Answers

This is a quick-n-dirty solution I made in a few minutes. It makes use of nice regex patterns that are not available everywhere.

This grabs a clean list of branches. I remove formatting spaces at the beginning of each line, and I'm ignoring tags for now:

git branch -r | sed 's|^[[:space:]]*||' | grep -v '^tags/' > git-branch-list

I grab a similar list of branches from svn, again removing formatting and trailing forward-slashes:

svn ls svn://path/to/branch/dir/ | sed 's|^[[:space:]]*||' | sed 's|/$||' > svn-branch-list

I diff the lists, find the lines that don't exist in the svn list anymore, remove the diff formatting, get rid of the "trunk" branch (which is a git-svn convenience) and save the results to a new list:

diff -u git-branch-list svn-branch-list | grep '^-' | sed 's|^-||' | grep -v '^trunk$' | grep -v '^--' > old-branch-list

Now I just perform standard branch removal procedures for git-svn:

for i in `cat old-branch-list`; do git branch -d -r "$i"; rm -rf .git/svn/refs/remotes/"$i"; done

There's probably better ways of doing this, but it works. Someone else is welcome to take this and improve on it.

like image 99
javaJake Avatar answered Sep 27 '22 21:09

javaJake