git/list[1] front-page[2] threads[3] people[4] search[5] about
 

git filter-branch --prune-empty not removing commits

From
MOMartijn van Oosterhout <kleptog@gmail.com>
Date
Feb 8, 2013, 15:23 UTC
Message-ID
<CADWG95sHx6Z2Ukon8FAHKa1qUOj4shd4MbCwahwX++FVWJPDDg@mail.gmail.com>
Hoi,

Found a small issue with git filter-branch not removing empty commits if they are the first commit in the tree. Find test script attached and example output below.

I think the issue is in the function git_commit_non_empty_tree, which doesn't handle this case. I think something like the following should work:

 git_commit_non_empty_tree()
 {
+        if test $# = 1 && test -z "$(git ls-tree $1)" ; then
+                skip_commit "$@"
+        fi
         if test $# = 3 && test "$1" = $(git rev-parse "$3^{tree}"); then
                 map "$3"
         else
                 git commit-tree "$@"
         fi
 }

If you're wondering how I got here, it was by using git svn to import a tree once converted by cvs2svn, which added empty commits to the svn repo to indicate the creation of branches.

Have a nice day,
---- Test script output (note: destroys the foo subdirectory) ----
+ git version
git version 1.7.9.5
+ echo ======== Setup ========
+ git init foo
Initialized empty Git repository in /tmp/foo/.git/
+ export GIT_AUTHOR_NAME=foo
+ export GIT_AUTHOR_EMAIL=foo@example.com
+ export GIT_COMMITTER_NAME=foo
+ export GIT_COMMITTER_EMAIL=foo@example.com
+ cd foo
+ git write-tree
+ git commit-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 -m Commit 1
+ COMMIT1=1dc65b84c016320ce0599f2bd78bcbb5e532658f
+ export GIT_AUTHOR_NAME=bar
+ export GIT_AUTHOR_EMAIL=bar@example.com
+ echo Hello World
+ git add file
+ git write-tree
+ git commit-tree 34b512cb05f8b709198d18d916ea6395c237ae0d -m Commit 2
-p 1dc65b84c016320ce0599f2bd78bcbb5e532658f
+ COMMIT2=11af492decae1284cd2d27af4c5a92b4aab46510
+ git branch -f master 11af492decae1284cd2d27af4c5a92b4aab46510
+ git log master --stat
commit 11af492decae1284cd2d27af4c5a92b4aab46510
Author: bar <bar@example.com>
Date:   Fri Feb 8 16:12:13 2013 +0100
    Commit 2
 file |    1 +
 1 file changed, 1 insertion(+)
commit 1dc65b84c016320ce0599f2bd78bcbb5e532658f
Author: foo <foo@example.com>
Date:   Fri Feb 8 16:12:13 2013 +0100
    Commit 1
+ echo ======== Bug: filter-branch --prune-empty not working ========
+ git filter-branch --prune-empty master
Rewrite 11af492decae1284cd2d27af4c5a92b4aab46510 (2/2)
WARNING: Ref 'refs/heads/master' is unchanged
+ git log master --stat
commit 11af492decae1284cd2d27af4c5a92b4aab46510
Author: bar <bar@example.com>
Date:   Fri Feb 8 16:12:13 2013 +0100
    Commit 2
 file |    1 +
 1 file changed, 1 insertion(+)
commit 1dc65b84c016320ce0599f2bd78bcbb5e532658f
Author: foo <foo@example.com>
Date:   Fri Feb 8 16:12:13 2013 +0100
    Commit 1
-- 
Martijn van Oosterhout <kleptog@gmail.com> http://svana.org/kleptog/
Next: Martijn van Oosterhout
Message 1 of 2 in “git filter-branch --prune-empty not removing commits”
  1. Martijn van OosterhoutFeb 8, 2013
  2. Martijn van OosterhoutFeb 8, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.