SVN remove symlinks How To
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
- contributions
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
- locally in shell or filesystem gui(dolphin,konqueror,etc.): remove the symlink
- in svn gui: update
- in svn gui: delete the directory
- in svn gui: commit
- locally in shell or filesystem gui(dolphin,konqueror,etc.): recreate the symlink
- in svn gui: set svn ignore property for the symlink