Automatycznie usuwaj niezerowe pliki Subversion
Czy ktoś zna sposób na rekurencyjne usunięcie wszystkich plików w kopii roboczej, które nie są pod kontrolą wersji? (Potrzebuję tego, aby uzyskać bardziej wiarygodne wyniki w moim automatycznym budowaniu VMware.)
30 answers
Edit:
Subversion 1.9.0 wprowadził opcję, aby to zrobić:
svn cleanup --remove-unversioned
Wcześniej używam do tego skryptu Pythona:
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))
Wygląda na to, że dobrze to robi.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-27 10:54:28
To działa dla mnie w bash:
svn status | egrep '^\?' | cut -c8- | xargs rm
Seth Reno jest lepszy:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Obsługuje niesprawdzone foldery i spacje w nazwach plików
Jak w komentarzach poniżej, działa to tylko na plikach, o których subversion nie wie (status=?). Wszystko, o czym wie subversion (W tym ignorowane pliki/foldery), nie zostanie usunięte.
Jeśli używasz subversion 1.9 lub nowszego, możesz po prostu użyć polecenia svn cleanup z --remove-unversioned and --remove-ignored options
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:58
Natknąłem się na tę stronę, szukając tego samego, choć nie dla zautomatyzowanego budowania.
Po dłuższym spojrzeniu odkryłem ' rozszerzone menu kontekstowe ' w TortoiseSVN. Przytrzymaj klawisz shift i kliknij prawym przyciskiem myszy kopię roboczą. W menu TortoiseSVN dostępne są teraz dodatkowe opcje, w tym ' Usuń niesprawdzone elementy...'.
Choć być może nie dotyczy to tego konkretnego pytania (tj. w kontekście zautomatyzowanego budowania), I pomyślałem, że może to być pomocne dla innych, którzy chcą zrobić to samo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 14:59:38
Zobacz: svn-clean
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-23 09:11:35
Jeśli jesteś w wierszu poleceń systemu windows,
for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i
Wersja ulepszona:
for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"
Jeśli używasz tego w pliku wsadowym, musisz podwoić %
:
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-17 14:52:18
Dodałem to do mojego profilu windows powershell
function svnclean {
svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 19:05:59
Linux command line:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
Lub, jeśli niektóre z Twoich plików są własnością roota:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
Jest to oparte na odpowiedzi Kena. (Odpowiedź Kena pomija ignorowane pliki; moja odpowiedź usuwa je).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 15:06:31
Po prostu zrób to na uniksowej powłoce za pomocą:
rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 11:50:57
Czy nie można po prostu zrobić eksport do nowej lokalizacji i zbudować stamtąd?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-27 08:41:02
Jeśli masz TortoiseSVN na swojej ścieżce i jesteś we właściwym katalogu:
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
Opcje są opisane w Pomocy TortoiseSVN dla /command:cleanup
:
Użyj /noui, aby zapobiec pojawianiu się okna wynikowego albo informowanie o zakończeniu czyszczenia lub wyświetlanie błędu wiadomość). / noprogressui wyłącza również okno dialogowe postępu. / nodlg wyłącza wyświetlanie okna czyszczenia, w którym użytkownik może wybrać, co dokładnie powinno się to zrobić podczas sprzątania. Na dostępne działania mogą być określone opcjami / cleanup dla statusu cleanup, / revert, / delunversioned, / delignored, / refreshshell i / externals.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 22:00:03
Jeśli używasz Tortoise svn, istnieje ukryte polecenie, aby to zrobić. Przytrzymaj klawisz shift, klikając prawym przyciskiem myszy folder, aby uruchomić menu kontekstowe w Eksploratorze windows. Otrzymasz polecenie "Usuń niesprawdzone Elementy".
Zobacz na dole tej strony Aby uzyskać szczegółowe informacje, lub zrzut ekranu poniżej, który podkreśla rozszerzone funkcje z zielonymi gwiazdkami, a jeden interesujący z żółtym prostokątem...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-14 06:58:14
Subversion 1.9.0 wprowadził opcję usuwania niewysokich pozycji [1]
svn cleanup --remove-unversioned
[1] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-11 18:36:57
Moja konwersja C# skryptu Pythona Thomasa Watnedala:
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();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-27 09:01:53
svn st --no-ignore | grep '^[?I]' | sed 's/^[?I] *//' | xargs -r -d '\n' rm -r
Jest to polecenie powłoki Uniksa do usuwania wszystkich plików nie znajdujących się pod kontrolą subversion.
Uwagi:
-
st
insvn st
jest aliasem wbudowanym dlastatus
, tzn. polecenie jest równoważnesvn status
-
--no-ignore
zawiera również pliki spoza repozytorium w wyjściu stanu, w przeciwnym razie ignoruje za pomocą mechanizmów takich jak.cvsignore
itd. - ponieważ celem jest posiadanie czystego punktu początkowego dla buildów, ten przełącznik jest koniecznością -
grep
filtruje Wyjście tak, że tylko pliki nieznane dla subversion są pozostawione-linie zaczynające się od?
Lista plików nieznanych dla subversion, które byłyby ignorowane bez opcji--no-ignore
- przedrostek do nazwy pliku jest usuwany przez
sed
- polecenie
xargs
jest poinstruowane przez-r
, aby nie wykonywaćrm
, gdy lista argumentów będzie pusta - opcja
-d '\n'
mówixargs
aby używać nowej linii jako ogranicznika, takie polecenie działa również dla nazw plików ze spacjami -
rm -r
jest używany w przypadku kompletnego katalogi (które nie są częścią repozytorium) muszą zostać usunięte
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 21:13:10
Nie mogłem uruchomić żadnego z powyższych bez dodatkowych zależności, których nie chciałem dodawać do mojego zautomatyzowanego systemu kompilacji na win32. Dlatego uĹ 'oĹźyĹ' em nastÄ ™ pujÄ ... ce polecenia Ant - zauwaĺź, Ĺźe wymagajÄ ... one zainstalowania JAR Ant-contrib (uĺźywaĺ ' em wersji 1.0B3, najnowszej, z Ant 1.7.0).
Uwaga spowoduje to usunięcie wszystkich niewysokich plików bez ostrzeżenia.
<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 "${basedir}""
outputProperty="status" />
<echo message="Deleting any unversioned files:" />
<for list="${status}" param="p" delimiter="
" 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>
Dla innego folderu Zmień referencję ${basedir}
.
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
Usuń echo, jeśli to jest pewne, co chcesz zrobić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-31 22:40:52
Ponieważ wszyscy to robią...
svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 15:01:16
Równie dobrze może wnieść inną opcję
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
The / (config/.ini) / jest dla moich własnych celów.
I może być dobrym pomysłem dodanie --no-ignore do komendy svn
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-28 22:35:07
Natknąłem się na svn-clean na mojej maszynie RH5. Its znajduje się w /usr / bin / svn-clean
Http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-17 21:59:51
Czyste rozwiązanie 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-05 16:53:01
Próbowałem wersji Setha Reno z tej odpowiedzi , ale nie zadziałało na mnie. Miałem 8 znaków przed nazwą pliku, a nie 9 używanych w cut -c9-
.
Więc to jest moja wersja z sed
zamiast cut
:
svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:42
Jeśli nie masz nic przeciwko powershellowi:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
Wyjmij flagę-WhatIf, aby polecenie faktycznie wykonało usunięcie. W przeciwnym razie wyświetli to, co zrobiłby, jeśli zostanie uruchomiony bez-WhatIf.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-06 03:53:02
Dodałbym to jako komentarz do odpowiedzi Thomasa Watnedala , ale jeszcze nie mogę.
Drobny problem z nim (który nie będzie miał wpływu na System Windows) polega na tym, że sprawdza tylko pliki lub katalogi. W systemach uniksopodobnych, w których mogą występować dowiązania symboliczne, konieczna jest zmiana linii:
if os.path.isfile(fullpath):
Do
if os.path.isfile(fullpath) or os.path.islink(fullpath):
Aby również usunąć linki.
Dla mnie zmiana ostatniej linii if match: removeall(match.group(1))
na
if match:
print "Removing " + match.group(1)
removeall(match.group(1))
Tak, że wyświetla to, co jest usuwane było przydatne też.
W zależności od przypadku użycia, ?[\?ID]
część wyrażenia regularnego może być lepsza jako ?[\?I]
, ponieważ D
usuwa również usunięte pliki, które były pod kontrolą wersji. Chcę użyć tego do zbudowania w czystym, sprawdzonym folderze, więc nie powinno być żadnych plików w stanie D
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 10:22:04
@ zhoufei przetestowałem Twoją odpowiedź i tu jest zaktualizowana wersja:
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"
- musisz użyć dwóch
%
znaków przed G i H - Przełącz kolejność: najpierw usuń wszystkie pliki, a następnie usuń wszystkie katalogi
- (opcjonalnie:) zamiast
%~1
można użyć dowolnej nazwy katalogu, użyłem tego jako funkcji w pliku bat, więc%~1
jest pierwszym parametrem wejściowym
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 17:19:45
Jeśli nie chcesz pisać żadnego kodu, svn2.exe z svn2svn robi to, istnieje również Artykuł o tym, jak to jest zaimplementowane. Usunięte foldery i pliki są umieszczane w koszu.
Uruchom " svn2.exe sync [ścieżka]".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 20:27:57
Dla ludzi, którzy lubią to robić z perlem zamiast Pythona, powłoki Uniksa, Javy itp. Oto mały skrypt Perla, który również wykonuje jib.
Uwaga: to również usuwa wszystkie niewysokiete katalogi
#!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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 22:04:55
Używając TortoiseSVN: * kliknij prawym przyciskiem myszy folder working copy, przytrzymując klawisz shift W Dół * wybierz "Usuń niesprawdzone elementy"
Jak mogę usunąć wszystkie niezweryfikowane / ignorowane pliki/foldery w mojej kopii roboczej?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:17
Czystym sposobem na zrobienie tego w Perlu byłoby:
#!/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 ()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-31 19:55:40
Użyłem ~3 godzin, aby to wygenerować. To zajmie 5 minut, aby to zrobić w Uniksie. Problemem sieciowym były: spacje w nazwach folderów Win, niemożność edycji % % i oraz problem z definiowaniem var w pętli 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!
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-28 14:06:27
Powyższy fragment kodu C# nie zadziałał u mnie - mam klienta tortoise svn, a linie są nieco inaczej sformatowane. Tutaj jest ten sam fragment kodu jak powyżej, tylko przepisany do funkcji i za pomocą 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 03:17:14