Автоматически удалять неверсированные файлы Subversion

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

107 голосов | спросил Stefan Schultze 27 +03002008-10-27T11:39:35+03:00312008bEurope/MoscowMon, 27 Oct 2008 11:39:35 +0300 2008, 11:39:35

27 ответов


0

Edit:

В Subversion 1.9.0 появилась возможность сделать это:

svn cleanup --remove-unversioned

До этого я использую этот скрипт на python:

 import os
import re

def removeall(path):
    if not os.path.isdir(path):
        os.remove(path)
        return
    files=os.listdir(path)
    for x in files:
        fullpath=os.path.join(path, x)
        if os.path.isfile(fullpath):
            os.remove(fullpath)
        elif os.path.isdir(fullpath):
            removeall(fullpath)
    os.rmdir(path)

unversionedRex = re.compile('^ ?[\?ID] *[1-9 ]*[a-zA-Z]* +(.*)')
for l in  os.popen('svn status --no-ignore -v').readlines():
    match = unversionedRex.match(l)
    if match: removeall(match.group(1))

Похоже, что делает работу довольно хорошо.

ответил Thomas Watnedal 27 +03002008-10-27T11:46:27+03:00312008bEurope/MoscowMon, 27 Oct 2008 11:46:27 +0300 2008, 11:46:27
0

это работает для меня в bash:

 svn status | egrep '^\?' | cut -c8- | xargs rm

Сет Рено лучше:

svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r 

Он обрабатывает неверсионные папки и пробелы в именах файлов

Согласно комментариям ниже, это работает только с файлами, о которых Subversion не знает (status =?). Все, что знает Subversion (включая пропущенные файлы /папки), не будет удалено.

Если вы используете Subversion 1.9 или выше, вы можете просто использовать svn cleanup с опциями --remove-unversioned и --remove-ignore

ответил Ken 27 +03002008-10-27T11:52:13+03:00312008bEurope/MoscowMon, 27 Oct 2008 11:52:13 +0300 2008, 11:52:13
0

Я перебрал эту страницу, пытаясь сделать то же самое, но не для автоматической сборки.

После более тщательного изучения я обнаружил Расширенное контекстное меню в TortoiseSVN. Удерживая клавишу Shift, щелкните правой кнопкой мыши рабочую копию. Теперь в меню TortoiseSVN есть дополнительные параметры, в том числе Удалить неверсированные элементы ... .

Хотя, возможно, это не относится к этому конкретному вопросу (т.е. в контексте автоматической сборки), я подумал, что это может быть полезно для других, желающих сделать то же самое.

ответил g . 30 J0000006Europe/Moscow 2009, 18:59:38
0

См .: svn-clean

ответил Martin 24 22009vEurope/Moscow11bEurope/MoscowTue, 24 Nov 2009 15:44:28 +0300 2009, 15:44:28
0

Если вы находитесь в командной строке Windows,

for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i

Улучшенная версия:

for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"

Если вы используете это в пакетном файле, вам нужно удвоить %:

for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
ответил Sukesh Nambiar 1 +04002009-10-01T11:19:17+04:00312009bEurope/MoscowThu, 01 Oct 2009 11:19:17 +0400 2009, 11:19:17
0

Я добавил это в свой профиль Windows PowerShell

function svnclean {
    svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
ответил Kyle 31 AM00000050000001331 2011, 05:34:13
0

Командная строка Linux:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r

Или, если некоторые из ваших файлов принадлежат root:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r

Это основано на ответе Кена. (Ответ Кена пропускает пропущенные файлы; мой ответ удаляет их).

ответил user9876 24 Maypm11 2011, 18:30:10
0

Просто сделайте это на Unix-оболочке с помощью:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
ответил bruziuz 5 J000000Friday13 2013, 18:31:02
0

Моя 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();
    }
}
ответил Stefan Schultze 27 +03002008-10-27T12:01:53+03:00312008bEurope/MoscowMon, 27 Oct 2008 12:01:53 +0300 2008, 12:01:53
0
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 используется в том случае, если необходимо удалить полные каталоги (которые не являются частью репозитория)
ответил maxschlepzig 23 J000000Wednesday14 2014, 00:52:38
0

Если у вас есть TortoiseSVN на вашем пути и вы находитесь в правильном каталоге:

TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui

Параметры описаны в справке TortoiseSVN для /command:cleanup:

  

Используйте /noui, чтобы предотвратить появление диалогового окна результатов.   либо рассказывает о завершении очистки, либо показывает ошибку   сообщение). /noprogressui также отключает диалог прогресса. /nodlg   отключает показ диалогового окна очистки, где пользователь может выбрать, что   точно должно быть сделано в уборке. Доступные действия могут быть   указывается в параметрах /cleanup для очистки статуса, /revert,   /delunversioned, /delignored, /refreshshell и /externals.

ответил stevek_mcc 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2016 00:33:19 +0300 2016, 00:33:19
0

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

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

 Расширенное контекстное меню SVN по сравнению со стандартным меню

ответил rob bentley 16 PM00000040000001931 2010, 16:00:19
0

Я не мог заставить работать все вышеперечисленное без дополнительных зависимостей, которые я не хотел добавлять в свою автоматизированную систему сборки на 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}.

ответил 23 PMpThu, 23 Apr 2009 16:16:30 +040016Thursday 2009, 16:16:30
0
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'

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

ответил Aria 31 FriEurope/Moscow2010-12-31T23:20:52+03:00Europe/Moscow12bEurope/MoscowFri, 31 Dec 2010 23:20:52 +0300 2010, 23:20:52
0

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

svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R
ответил JoshC13 30 Maypm13 2013, 19:01:16
0

Можно также добавить другой вариант

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

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

И, возможно, было бы неплохо добавить --no-ignore к команде svn

ответил user1299374 29 MaramThu, 29 Mar 2012 02:35:07 +04002012-03-29T02:35:07+04:0002 2012, 02:35:07
0

Я наткнулся на svn-clean на моей машине RH5. Он расположен в /usr /bin /svn-clean

http: //svn.apache. орг /репо /АЧС /подрывная /багажник /вно /на стороне клиента /СВН-чистый

ответил Eric Cope 18 AMpWed, 18 Apr 2012 01:59:51 +040059Wednesday 2012, 01:59:51
0

Чистое решение для Windows 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
ответил Andriy F. 23 SunEurope/Moscow2012-12-23T03:00:25+04:00Europe/Moscow12bEurope/MoscowSun, 23 Dec 2012 03:00:25 +0400 2012, 03:00:25
0

Я пробовал версию Сета Рено из этот ответ , но он не сработал для меня. У меня было 8 символов перед именем файла, а не 9 использовалось в cut -c9-.

Итак, это моя версия с sed вместо cut:

svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
ответил nkoder 30 Jam1000000amThu, 30 Jan 2014 00:01:09 +040014 2014, 00:01:09
0

Если вы круты с PowerShell:

svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }

Снимите флаг -WhatIf, чтобы команда действительно выполняла удаление. В противном случае он просто выведет то, что сделал бы , если бы он работал без -WhatIf.

ответил Giscard Biamby 6 FebruaryEurope/MoscowbFri, 06 Feb 2015 06:53:02 +0300000000amFri, 06 Feb 2015 06:53:02 +030015 2015, 06:53:02
0

@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 является первым входным параметром
ответил Nikola 8 PM00000050000001131 2018, 17:59:11
0

Если вы не хотите писать какой-либо код, svn2.exe из svn2svn делает это, а также есть статья о том, как это реализовано. Удаленные папки и файлы помещаются в корзину.

Запустите "svn2.exe sync [путь]".

ответил dB. 2 22010vEurope/Moscow11bEurope/MoscowTue, 02 Nov 2010 23:27:57 +0300 2010, 23:27:57
0

Для людей, которые любят делать это с помощью perl вместо python, оболочки Unix, java и т. д. Настоящим небольшой скрипт на perl, который также выполняет jib.

Примечание. При этом также удаляются все неверсионные каталоги.

#!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();
ответил 31 J000000Friday09 2009, 16:22:18
0

Использование TortoiseSVN: * щелкните правой кнопкой мыши папку рабочей копии, удерживая нажатой клавишу Shift *, выберите "удалить неверсионные элементы"

Как я могу удалить все неверсированные /проигнорированные файлы /папки в моей рабочей копии?

ответил umpirsky 28 PMpThu, 28 Apr 2011 14:17:01 +040017Thursday 2011, 14:17:01
0

Чистый способ сделать это в PERL:

#!/usr/bin/perl
use IO::CaptureOutput 'capture_exec'

my $command = sprintf ("svn status --no-ignore | grep '^?' | sed -n 's/^\?//p'");

my ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
my @listOfFiles = split ( ' ', $stdout );

foreach my $file ( @listOfFiles )
{ # foreach ()
    $command = sprintf ("rm -rf %s", $file);
    ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
} # foreach ()
ответил J. T. Marsh 31 J000000Wednesday13 2013, 23:55:40
0

Я использовал ~ 3 часа, чтобы сгенерировать это. Это займет 5 минут, чтобы сделать это в Unix. Основная проблема заключалась в следующем: пробелы в именах папок Win, невозможность редактировать %% i и проблема с определением переменных в цикле Win cmd.

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!
)
ответил Ilya Rosman 28 FebruaryEurope/MoscowbFri, 28 Feb 2014 15:59:02 +0400000000pmFri, 28 Feb 2014 15:59:02 +040014 2014, 15:59:02
0

Для людей на окнах, которые хотят избежать использования какого-либо инструмента, кроме стандартных команд MS-Dos, вот решение:

FOR /F "tokens = 1 * delims ="% G IN ('svn st ^ | findstr "^?"') DO rd /s /q "% H"

FOR /F "tokens = 1 * delims ="% G IN ('svn st ^ | findstr "^?"') DO del /s /f /q "% H"

  • svn st будет отображать состояние всех файлов и папок в рабочей копии
  • findstr будет искать каждую строку, начинающуюся с '?', что означает, что файл /папка не версионные
  • FOR будет использовать в качестве разделителей и брать токены после 1-го (1-й -% G, остальное -% H) Таким образом, мы извлекаем файл /папку из вывода команды svn st.
  • rd удалит папки, del удалит файлы.
ответил zhoufei 13 J000000Monday15 2015, 06:31:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132