SVN remove symlinks How To

Linux

It is easy to accidentally commit symlinks to an SVN repository. Once you do it is not so easy to remove them.
When you commit a symlink to svn, svn doesn't commit the symlink file, rather it adds the symlink as a directory and follow the symlink adding the contents. This isn't really svn doing this but rather the filesystem.

For example (I will use a Drupal site example) I typically checkout files and modules via CVS in a contributions dir and symlink to those from the modules and themes dir so my file sistem is like this 

  • public_html
    • contributions
      • modules
      • themes
    • modules
      • contributions > ../contributions/modules
    • themes
      • contributions > ../contributions/themes

svn add public_html
svn commit -m 'oops we added symlinks to svn'

Because these are really just directories in SVN trying to remove them will cause an error because svn is expecting a directory and not a file

cd public_html/modules
svn delete contributions
Error: contributions is a file

Solution, delete the symlink, do an svn update which will checkout the symlink as a directory and then delete the directory from svn.

cd public_html/modules
rm contributions
svn update
svn delete contributions

svn commit -m 'removing symlink from repository'
ln -s ../contributions/modules contributions
svn addprop svn:ignore contributions public_html/modules/

Problem solved.
If you use an svn gui client the process is the same

  1. locally in shell or filesystem gui(dolphin,konqueror,etc.): remove the symlink
  2. in svn gui: update
  3. in svn gui: delete the directory
  4. in svn gui: commit
  5. locally in shell or filesystem gui(dolphin,konqueror,etc.): recreate the symlink
  6. in svn gui: set svn ignore property for the symlink