Автоматически удалять неверсированные файлы Subversion - PullRequest
108 голосов
/ 27 октября 2008

Кто-нибудь знает способ рекурсивного удаления всех файлов в рабочей копии, которые не находятся под контролем версий? (Мне нужно это, чтобы получить более надежные результаты в моей автоматической сборке VMware.)

Ответы [ 32 ]

3 голосов
/ 16 августа 2010

Если вы используете svn tortoise, для этого есть скрытая команда. Удерживайте клавишу shift, одновременно щелкая правой кнопкой мыши по папке, чтобы запустить контекстное меню в проводнике Windows. Вы получите команду «Удалить неверсированные элементы».

см. Нижнюю часть этой страницы для получения подробной информации или снимок экрана ниже, на котором выделенные элементы выделены зелеными звездами, а интересующий объект - желтым прямоугольником ...

SVN Extended context menu vs standard menu

3 голосов
/ 27 октября 2008

Моя C # конвертация скрипта Томаса Ватнедалса на Python:

Console.WriteLine("SVN cleaning directory {0}", directory);

Directory.SetCurrentDirectory(directory);

var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.WorkingDirectory = directory;

using (var process = Process.Start(psi))
{
    string line = process.StandardOutput.ReadLine();
    while (line != null)
    {
        if (line.Length > 7)
        {
            if (line[0] == '?')
            {
                string relativePath = line.Substring(7);
                Console.WriteLine(relativePath);

                string path = Path.Combine(directory, relativePath);
                if (Directory.Exists(path))
                {
                    Directory.Delete(path, true);
                }
                else if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }
        }
        line = process.StandardOutput.ReadLine();
    }
}
3 голосов
/ 11 августа 2018

В Subversion 1.9.0 введена опция для удаления неверсированных элементов [1]

svn cleanup --remove-unversioned

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

3 голосов
/ 23 июля 2014
svn st --no-ignore  | grep '^[?I]' | sed 's/^[?I]  *//' | xargs -r -d '\n' rm -r

Это команда оболочки unix для удаления всех файлов, не находящихся под контролем subversion.

Примечания:

  • st в svn st является встроенным псевдонимом для status, то есть команда эквивалентна svn status
  • --no-ignore также включает файлы без репозитория в вывод состояния, в противном случае игнорируется с помощью таких механизмов, как .cvsignore и т. Д., Поскольку цель состоит в том, чтобы иметь чистую отправную точку для сборок, этот переключатель является обязательным
  • grep фильтрует выходные данные так, что остаются только файлы, неизвестные Subversion - строки, начинающиеся с ?, перечисляют файлы, неизвестные Subversion, которые были бы проигнорированы без опции --no-ignore
  • префикс до имени файла удаляется через sed
  • команда xargs дает команду через -r не выполнять rm, когда список аргументов будет пустым
  • опция -d '\n' указывает xargs использовать символ новой строки в качестве разделителя, такая команда также работает для имен файлов с пробелами
  • rm -r используется, если необходимо удалить полные каталоги (которые не являются частью репозитория)
2 голосов
/ 31 декабря 2010
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'

уберите эхо, если вы уверены, что хотите сделать.

2 голосов
/ 30 мая 2013

Так как все остальные делают это ...

svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R
2 голосов
/ 23 апреля 2009

Я не мог заставить работать все вышеперечисленное без дополнительных зависимостей, которые я не хотел добавлять в свою автоматизированную систему сборки на win32. Поэтому я собрал следующие команды Ant - обратите внимание, что для этого требуется установить JAR Ant-contrib (я использовал последнюю версию 1.0b3, с Ant 1.7.0).

Обратите внимание, что все неверсированные файлы удаляются без предупреждения.

  <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>

Для другой папки измените ссылку ${basedir}.

1 голос
/ 23 декабря 2012

Чистые окна cmd / bat решение:

@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
1 голос
/ 29 марта 2012

Можно добавить еще один вариант

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/ для моих собственных целей.

И может быть хорошей идеей добавить --no-ignore к команде svn

1 голос
/ 08 августа 2018

@ zhoufei Я проверил ваш ответ и вот обновленная версия:

FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO del /s /f /q "%%H"
FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO rd /s /q "%%H"
  • Вы должны использовать две % метки перед G и H
  • Переключите порядок: сначала удалите все файлы, затем удалите все каталоги
  • (необязательно :) Вместо %~1 может использоваться любое имя каталога, я использовал это как функцию в файле bat, поэтому %~1 является первым входным параметром
...