Keep git-svn from keeping empty directories

git-svn keeps empty directories, which may become a problem (e.g.) when renaming directories. This behavior manifests in messages such as “W: -empty_dir abc/dir” during dcommit and, how it can be altered, I describe in this article.

Configuration for removing empty directories during git svn dcommit

To avoid keeping empty directories around, use the –rmdir flag during git svn dcommit:

git svn dcommit --rmdir

To make this behavior permanent, we can use git config (Can be verified by taking a look at the [svn] section in ~/.gitconfig):

git config --global svn.rmdir true

Now, when performing svn dcommit, you should see that empty directories get deleted (see the lines starting with D+).

Removing legacy empty directories

For the time being, we only fixed the future behavior of git svn, but there are still empty directories left in the Subversion repository. To clean these up, we need an Subversion working copy of the repository. Go to the SVN working copy and determine the empty directories:

find . -wholename './.svn' -prune -o -type d -empty -print > empty_dirs.txt

This call will exclude the .svn directory (-prune flag) and include the “lowest” empty directories in the directory tree. Therefore, we need to iterate the deletion procedure several times until no more empty “leaf directories” remain. Next, investigate empty_dirs.txt and see whether it contains directories that you want to keep – edit empty_dirs.txt if necessary:

grep -f empty_dirs.txt empty_dirs.txt

Now comes the time to schedule the directories for deletion (if there remain empty directories to be deleted):

grep -f empty_dirs.txt empty_dirs.txt | xargs svn delete

Now, rerun the find command to find directories that are now eligible for deletion and repeat the xargs svn delete. At the end, review you changes with svn status and commit them with

svn commit

Finally, the same steps have to be performed in the git svn working copy after a git svn rebase.

References

  • [1] Peter Boling describes a similar solution