How can I delete all unversioned/ignored files/folders in my working copy?

Solution 1:

I know this is old but in case anyone else stumbles upon it, newer versions (1.9 or later) of svn support --remove-unversioned, e.g. svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options

Solution 2:

svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

This has the following features:

  • Both ignored and untracked files are deleted
  • It works even if a file name contains whitespace (except for newline, but there's not much that can be done about that other than use the --xml option and parse the resulting xml output)
  • It works even if svn status prints other status characters before the file name (which it shouldn't because the files are not tracked, but just in case...)
  • It should work on any POSIX-compliant system

I use a shell script named svnclean that contains the following:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done

Solution 3:

Using TortoiseSVN:

  • right-click on working copy folder, while holding the shift-key down
  • choose "delete unversioned items"

Solution 4:

This oneliner might help you:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

Use with care!

Solution 5:

Modifying Yanal-Yves Fargialla and gimpf's answers using Powershell (but not being allowed to comment on the original post by Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

This adds the carat ("^") to specify the start of line, avoiding matching all files that contain the letter "i". Also add the flags for -recurse and -force to rm to make this command non-interactive and so usable in a script.