Prune empty merge commits from history in Git repository
This is superior to the rebase solution because it preserves committer info, committer dates, and non-empty merges of the original history.
git filter-branch --prune-empty --parent-filter \ 'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'
This is inspired by the same thread on the kernel mailing list than Lucas' solution. However it does not require Ruby and is a one-liner. It does require GNU versions of xargs
and sed
though.
I needed to do this after running filter-branch
on a copy of ssokolow/profile to separate out ssokolow/lap.
This did a decent job as an automatic "collapse away anything left vestigial by --prune-empty
" command:
git rebase --root HEAD
(I needed the --root
so it would replace the now-empty initial commit with the oldest one that still had content.)
This looks like it worked for me: http://git.661346.n2.nabble.com/Removing-useless-merge-commit-with-quot-filter-branch-quot-td7356544.html
git filter-branch -f --prune-empty --parent-filter FULL_PATH_TO/rewrite_parent.rb master
rewrite_parent.rb
:
#!/usr/bin/ruby old_parents = gets.chomp.gsub('-p ', ' ') if old_parents.empty? then new_parents = [] else new_parents = `git show-branch --independent #{old_parents}`.split end puts new_parents.map{|p| '-p ' + p}.join(' ')