Automatically remove Subversion unversioned files

前端 未结 30 2909
感情败类
感情败类 2020-11-28 18:54

Does anybody know a way to recursively remove all files in a working copy that are not under version control? (I need this to get more reliable results in my automatic build

相关标签:
30条回答
  • 2020-11-28 19:18

    For the people that like to do this with perl instead of python, Unix shell, java, etc. Hereby a small perl script that does the jib as well.

    Note: This also removes all unversioned directories

    #!perl
    
    use strict;
    
    sub main()
    
    {
    
        my @unversioned_list = `svn status`;
    
        foreach my $line (@unversioned_list)
    
        {
    
            chomp($line);
    
            #print "STAT: $line\n";
    
            if ($line =~/^\?\s*(.*)$/)
    
            {
    
                #print "Must remove $1\n";
    
                unlink($1);
    
                rmdir($1);
    
            }
    
        }
    
    }
    
    main();
    
    0 讨论(0)
  • 2020-11-28 19:19

    I used ~3 hours to generate this. It would take 5 mins to do it in Unix. The mains issue were: spaces in names for Win folders, impossibility to edit %%i and problem with defining vars in Win cmd loop.

    setlocal enabledelayedexpansion
    
    for /f "skip=1 tokens=2* delims==" %%i in ('svn status --no-ignore --xml ^| findstr /r "path"') do (
    @set j=%%i
    @rd /s /q !j:~0,-1!
    )
    
    0 讨论(0)
  • 2020-11-28 19:20
    svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
    

    remove the echo if that's sure what you want to do.

    0 讨论(0)
  • 2020-11-28 19:21

    C# code snipet above did not work for me - I have tortoise svn client, and lines are formatted slightly differently. Here is same code snipet as above, only rewritten to function and using regex.

            /// <summary>
        /// Cleans up svn folder by removing non committed files and folders.
        /// </summary>
        void CleanSvnFolder( string folder )
        {
            Directory.SetCurrentDirectory(folder);
    
            var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            psi.WorkingDirectory = folder;
            psi.CreateNoWindow = true;
    
            using (var process = Process.Start(psi))
            {
                string line = process.StandardOutput.ReadLine();
                while (line != null)
                {
                    var m = Regex.Match(line, "\\? +(.*)");
    
                    if( m.Groups.Count >= 2 )
                    {
                        string relativePath = m.Groups[1].ToString();
    
                        string path = Path.Combine(folder, relativePath);
                        if (Directory.Exists(path))
                        {
                            Directory.Delete(path, true);
                        }
                        else if (File.Exists(path))
                        {
                            File.Delete(path);
                        }
                    }
                    line = process.StandardOutput.ReadLine();
                }
            }
        } //CleanSvnFolder
    
    0 讨论(0)
  • 2020-11-28 19:24

    I couldn't get any of the above to work without additional dependencies I didn't want to have to add to my automated build system on win32. So I put together the following Ant commands - note these require the Ant-contrib JAR to be installed in (I was using version 1.0b3, the latest, with Ant 1.7.0).

    Note this deletes all unversioned files without warning.

      <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
      <taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" />
    
      <macrodef name="svnExecToProperty">
        <attribute name="params" />
        <attribute name="outputProperty" />
        <sequential>
          <echo message="Executing Subversion command:" />
          <echo message="  svn @{params}" />
          <exec executable="cmd.exe" failonerror="true"
                outputproperty="@{outputProperty}">
            <arg line="/c svn @{params}" />
          </exec>
        </sequential>
      </macrodef>
    
      <!-- Deletes all unversioned files without warning from the 
           basedir and all subfolders -->
      <target name="!deleteAllUnversionedFiles">
        <svnExecToProperty params="status &quot;${basedir}&quot;" 
                           outputProperty="status" />
        <echo message="Deleting any unversioned files:" />
        <for list="${status}" param="p" delimiter="&#x0a;" trim="true">
          <sequential>
            <if>
              <matches pattern="\?\s+.*" string="@{p}" />
              <then>
                <propertyregex property="f" override="true" input="@{p}" 
                               regexp="\?\s+(.*)" select="\1" />
                <delete file="${f}" failonerror="true" />
              </then>
            </if>
          </sequential>
        </for>
        <echo message="Done." />
      </target>
    

    For a different folder, change the ${basedir} reference.

    0 讨论(0)
  • 2020-11-28 19:24

    Pure windows cmd/bat solution:

    @echo off
    
    svn cleanup .
    svn revert -R .
    For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
         If [%%A]==[?] ( Call :UniDelete %%B
         ) Else If [%%A]==[I] Call :UniDelete %%B
       )
    svn update .
    goto :eof
    
    :UniDelete delete file/dir
    if "%1"=="%~nx0" goto :eof
    IF EXIST "%1\*" ( 
        RD /S /Q "%1"
    ) Else (
        If EXIST "%1" DEL /S /F /Q "%1"
    )
    goto :eof
    
    0 讨论(0)
提交回复
热议问题