Çalışan bir kopyadaki sürüm kontrolü altında olmayan tüm dosyaları yinelemeli olarak kaldırmanın bir yolunu bilen var mı? (Otomatik derleme VMware'imde daha güvenilir sonuçlar almak için buna ihtiyacım var.)
hg purge --all
Mercurial'de.
Çalışan bir kopyadaki sürüm kontrolü altında olmayan tüm dosyaları yinelemeli olarak kaldırmanın bir yolunu bilen var mı? (Otomatik derleme VMware'imde daha güvenilir sonuçlar almak için buna ihtiyacım var.)
hg purge --all
Mercurial'de.
Yanıtlar:
Düzenle:
Subversion 1.9.0, bunu yapmak için bir seçenek sundu:
svn cleanup --remove-unversioned
Bundan önce, bunu yapmak için bu python betiğini kullanıyorum:
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))
İşi oldukça iyi yapıyor gibi görünüyor.
svn cleanup --remove-unversioned
daha iyidir. Ve Subversion 1.9.0 içindir (bu sürüm 2015'ten itibaren). Kararlı ve standarttır.
bu benim için bash'da çalışıyor:
svn status | egrep '^\?' | cut -c8- | xargs rm
Seth Reno ' nunki daha iyidir:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Dosya adlarındaki değiştirilmemiş klasörleri ve boşlukları yönetir
Aşağıdaki yorumlara göre, bu yalnızca subversion'ın bilmediği dosyalarda çalışır (status =?). Yıkılma o şey yok silinmez (Yok Sayılan dosya / klasörleri dahil) biliyorum.
Subversion 1.9 veya daha üstünü kullanıyorsanız svn cleanup komutunu --remove-unversioned ve --remove-ignored seçenekleriyle kullanabilirsiniz.
svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
Otomatik bir derleme için olmasa da aynı şeyi yapmaya çalışırken bu sayfaya rastladım.
Biraz daha baktıktan sonra TortoiseSVN'de ' Genişletilmiş Bağlam Menüsü'nü keşfettim . Shift tuşunu basılı tutun ve çalışan kopyaya sağ tıklayın. TortoiseSVN menüsü altında artık ' Sürülmemiş öğeleri sil ... ' dahil ek seçenekler var .
Bu belirli soru için belki uygulanabilir olmasa da (yani, otomatikleştirilmiş bir yapı bağlamında), aynı şeyi yapmak isteyen başkaları için yararlı olabileceğini düşündüm.
Windows komut satırındaysanız,
for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i
Gelişmiş versiyon:
for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"
Bunu bir toplu iş dosyasında kullanırsanız, aşağıdakileri ikiye katlamanız gerekir %
:
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
Bunu Windows powershell profilime ekledim
function svnclean {
svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
--no-ignore
için svn status
ve -Recurse
içinRemove-Item
Linux komut satırı:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
Veya dosyalarınızdan bazılarının sahibi kökse:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
Bu Ken'in cevabına dayanmaktadır. (Ken'in cevabı göz ardı edilen dosyaları atlar; cevabım onları siler).
Bunu unix-shell'de şununla yapın:
rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
Yolunuzda TortoiseSVN varsa ve doğru dizindeyseniz:
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
Seçenekler, TortoiseSVN yardımında şu konularda açıklanmıştır /command:cleanup
:
Sonuç iletişim kutusunun açılarak temizlemenin bittiğini bildirmesini veya bir hata mesajı göstermesini önlemek için / noui kullanın. / noprogressui ayrıca ilerleme iletişim kutusunu devre dışı bırakır. / nodlg, kullanıcının temizlemede tam olarak ne yapılması gerektiğini seçebileceği temizleme iletişim kutusunu göstermeyi devre dışı bırakır. Mevcut eylemler, durum temizleme için / cleanup, / revert, / delunversioned, / delignored, / refreshshell ve / externals seçenekleriyle belirtilebilir.
Kaplumbağa svn kullanıyorsanız, bunu yapmak için gizli bir komut vardır. Windows gezgininde bağlam menüsünü başlatmak için bir klasöre sağ tıklarken vardiyayı basılı tutun. Bir "Sürüm Edilmemiş Öğeleri Sil" komutu alacaksınız.
Ayrıntılar için bu sayfanın altına veya genişletilmiş özellikleri yeşil yıldızlarla ve ilgi çekici olanı sarı dikdörtgenle vurgulayan aşağıdaki ekran görüntüsüne bakın ...
Subversion 1.9.0, değiştirilmemiş öğeleri kaldırma seçeneği sundu [1]
svn cleanup --remove-unversioned
[1] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
Thomas Watnedals Python komut dosyasının C # dönüşümüm:
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();
}
}
svn st --no-ignore | grep '^[?I]' | sed 's/^[?I] *//' | xargs -r -d '\n' rm -r
Bu, subversion kontrolü altında olmayan tüm dosyaları silmek için bir unix kabuk komutudur.
Notlar:
st
içinde svn st
bir yap-için verilen adlar olduğu status
, yani komut eşdeğerdirsvn status
--no-ignore
ayrıca durum çıktısında depo dışı dosyaları da içerir, aksi takdirde .cvsignore
vb. mekanizmalar yoluyla yok sayar - amaç derlemeler için temiz bir başlangıç noktasına sahip olmak olduğundan bu anahtar bir zorunlulukturgrep
tahrip etmek böyle çıktı sadece bilinmeyen dosyaları filtreler bırakılır - çizgiler ile başlayan ?
olmadan göz ardı olacağını tahrip etmek listesi dosyaları bilinmeyen --no-ignore
seçeneğised
xargs
Komut yoluyla talimatı -r
yürütmek değil rm
argüman listesi boş olurdu zaman,-d '\n'
seçenek söyler xargs
böyle komut da boşluklu dosya adları için çalışır sınırlayıcı olarak bir yeni satır kullanmakrm -r
tam dizinlerin (havuzun parçası olmayan) kaldırılması gerektiğinde kullanılırYukarıdakilerin hiçbirinin ek bağımlılıklar olmadan çalışmasını sağlayamadım, win32'deki otomatik derleme sistemime eklemek zorunda kalmak istemedim. Bu yüzden aşağıdaki Ant komutlarını bir araya getirdim - bunların Ant-Contributor JAR'ın yüklenmesini gerektirdiğini unutmayın (En son sürüm 1.0b3'ü Ant 1.7.0 ile kullanıyordum).
Bunun sürümsüz tüm dosyaları uyarı vermeden sildiğini unutmayın.
<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>
Farklı bir klasör için ${basedir}
referansı değiştirin .
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
Yapmak istediğinizden eminseniz yankıyı kaldırın.
/bin/sh
ve n rm
süreç vardır.
Herkes yaptığı için ...
svn status | grep ^? | awk '{print $2}' | sed 's/^/.\//g' | xargs rm -R
Başka bir seçeneğe de katkıda bulunabilir
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(Config|.ini)/ kendi amaçlarım içindir.
Ve svn komutuna --no-ignore eklemek iyi bir fikir olabilir
RH5 makinemde svn-clean'e rastladım. / Usr / bin / svn-clean adresinde bulunur
http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean
Saf Windows cmd / bat çözümü:
@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
Seth Reno'nun versiyonunu bu cevaptan denedim ama benim için işe yaramadı. Dosya adından önce 8 karakterim vardı, 9 karakterinde kullanılmadı cut -c9-
.
Yani bu benim sürümüdür sed
yerine cut
:
svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
Powershell konusunda iyiyseniz:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
Komutun silme işlemlerini gerçekten gerçekleştirmesini sağlamak için -WhatIf bayrağını çıkarın. Aksi takdirde sadece çıkış o ne olacağını -whatIf olmadan çalıştırırsanız yapmak.
Bunu Thomas Watnedal'ın cevabına bir yorum olarak ekleyecektim ama henüz yapamam.
Bununla ilgili küçük bir sorun (Windows'u etkilemeyecek), yalnızca dosyaları veya dizinleri kontrol etmesidir. Sembolik bağlantıların mevcut olabileceği Unix benzeri sistemler için satırı değiştirmek gerekir:
if os.path.isfile(fullpath):
için
if os.path.isfile(fullpath) or os.path.islink(fullpath):
bağlantıları da kaldırmak için.
Benim için son satırı değiştirerek if match: removeall(match.group(1))
içine
if match:
print "Removing " + match.group(1)
removeall(match.group(1))
böylece neyin kaldırıldığını da gösterir.
Kullanım durumuna bağlı ?[\?ID]
olarak ?[\?I]
, D
sürüm kontrolü altında olan silinmiş dosyaları da kaldırdığı için normal ifadenin parçası daha iyi olabilir . Bunu temiz, kontrol edilmiş bir klasör oluşturmak için kullanmak istiyorum, bu nedenle bir D
durumda dosya olmamalı .
@zhoufei Cevabınızı test ettim ve güncellenmiş versiyon:
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 ve H'nin önünde iki işaret kullanmalısınız%~1
Herhangi bir dizin adı kullanılabilir yerine, bunu bir bat dosyasında bir işlev olarak kullandım, bu yüzden %~1
ilk giriş parametresiHerhangi bir kod yazmak istemiyorsanız, svn2svn'den svn2.exe bunu yapar, ayrıca nasıl uygulandığına dair bir makale de vardır . Silinen klasörler ve dosyalar geri dönüşüm kutusuna konur.
"Svn2.exe sync [yol]" komutunu çalıştırın.
Bunu python, Unix shell, java, vb. Yerine perl ile yapmaktan hoşlananlar için. Burada jib de yapan küçük bir perl betiği.
Not: Bu aynı zamanda tüm değiştirilmemiş dizinleri de kaldırır.
#!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();
TortoiseSVN'yi kullanma: * çalışan kopya klasörüne sağ tıklayın, üst karakter tuşunu basılı tutarken * "değiştirilmemiş öğeleri sil" i seçin
Çalışma kopyamdaki tüm değiştirilmemiş / yok sayılmış dosyaları / klasörleri nasıl silebilirim?
Bunu PERL'de yapmanın temiz bir yolu şudur:
#!/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 ()
Bunu oluşturmak için ~ 3 saat kullandım. Bunu Unix'te yapmak 5 dakika sürer. Ana hat sorunu şöyleydi: Win klasörleri için adlarda boşluklar, %% i'yi düzenlemenin imkansızlığı ve Win cmd döngüsünde değişkenleri tanımlamayla ilgili sorun.
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!
)
Yukarıdaki C # kod parçacığı benim için işe yaramadı - kaplumbağa svn istemcim var ve satırlar biraz farklı biçimlendirilmiş. Burada yukarıdakiyle aynı kod parçacığı var, yalnızca işlev görecek ve normal ifade kullanılarak yeniden yazılmış.
/// <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