Adakah yang tahu cara untuk secara rekursif menghapus semua file dalam copy pekerjaan yang tidak di bawah kendali versi? (Saya membutuhkan ini untuk mendapatkan hasil yang lebih andal dalam VMware build otomatis saya.)
hg purge --all
di Mercurial.
Adakah yang tahu cara untuk secara rekursif menghapus semua file dalam copy pekerjaan yang tidak di bawah kendali versi? (Saya membutuhkan ini untuk mendapatkan hasil yang lebih andal dalam VMware build otomatis saya.)
hg purge --all
di Mercurial.
Jawaban:
Edit:
Subversion 1.9.0 memperkenalkan opsi untuk melakukan ini:
svn cleanup --remove-unversioned
Sebelum itu, saya menggunakan skrip python ini untuk melakukan itu:
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))
Tampaknya melakukan pekerjaan dengan cukup baik.
svn cleanup --remove-unversioned
lebih baik. Dan untuk Subversion 1.9.0 (versi ini dari 2015). Ini stabil dan standar.
ini bekerja untuk saya di pesta:
svn status | egrep '^\?' | cut -c8- | xargs rm
Seth Reno lebih baik:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Ini menangani folder dan spasi tidak berversi dalam nama file
Sesuai dengan komentar di bawah, ini hanya bekerja pada file yang subversi tidak tahu tentang (status =?). Apa pun yang subversi tidak tahu tentang (termasuk Diabaikan file / folder) tidak akan dihapus.
Jika Anda menggunakan subversi 1.9 atau lebih tinggi, Anda dapat menggunakan perintah pembersihan svn dengan opsi --remove-unversioned dan --remove-ignored
svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
Saya berlari melintasi halaman ini sambil mencari untuk melakukan hal yang sama, meskipun bukan untuk pembuatan otomatis.
Setelah mencari lebih banyak, saya menemukan ' Menu Konteks yang Diperluas ' di TortoiseSVN. Tahan tombol shift dan klik kanan pada copy pekerjaan. Sekarang ada opsi tambahan di bawah menu TortoiseSVN termasuk ' Hapus item tidak berversi ... '.
Meskipun mungkin tidak berlaku untuk pertanyaan khusus ini (yaitu dalam konteks pembuatan otomatis), saya pikir ini mungkin berguna bagi orang lain yang ingin melakukan hal yang sama.
Jika Anda menggunakan baris perintah windows,
for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i
Versi yang ditingkatkan:
for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"
Jika Anda menggunakan ini dalam file batch, Anda perlu menggandakan %
:
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
Saya menambahkan ini ke profil windows PowerShell saya
function svnclean {
svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
--no-ignore
ke svn status
dan -Recurse
keRemove-Item
Baris perintah Linux:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
Atau, jika beberapa file Anda dimiliki oleh root:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
Ini berdasarkan jawaban Ken. (Jawaban Ken melewatkan file yang diabaikan; jawaban saya menghapusnya).
Lakukan saja di unix-shell dengan:
rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
Bisakah Anda tidak hanya melakukan ekspor ke lokasi baru dan membangun dari sana?
Jika Anda memiliki TortoiseSVN di jalur Anda dan Anda berada di direktori yang benar:
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
Opsi dijelaskan dalam bantuan TortoiseSVN untuk /command:cleanup
:
Gunakan / noui untuk mencegah dialog hasil bermunculan baik yang memberi tahu tentang pembersihan yang selesai atau menampilkan pesan kesalahan). / noprogressui juga menonaktifkan dialog kemajuan. / nodlg menonaktifkan menampilkan dialog pembersihan di mana pengguna dapat memilih apa yang harus dilakukan dalam pembersihan. Tindakan yang tersedia dapat dispesifikasikan dengan opsi / pembersihan untuk pembersihan status, / kembali, / delunversioned, / delignored, / refreshshell dan / externals.
Jika Anda menggunakan tortoise svn, ada perintah tersembunyi untuk melakukan ini. Tahan shift sambil mengklik kanan pada folder untuk meluncurkan menu konteks di windows explorer. Anda akan mendapatkan perintah "Hapus Item Tidak Berversi".
lihat bagian bawah halaman ini untuk detailnya, atau cuplikan layar di bawah ini yang menyoroti fitur tambahan dengan bintang hijau, dan salah satu yang menarik dengan persegi panjang kuning ...
Subversion 1.9.0 memperkenalkan opsi untuk menghapus item tidak berversi [1]
svn cleanup --remove-unversioned
[1] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
Konversi C # saya dari skrip Thomas Watnedals 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();
}
}
svn st --no-ignore | grep '^[?I]' | sed 's/^[?I] *//' | xargs -r -d '\n' rm -r
Ini adalah perintah shell unix untuk menghapus semua file yang tidak berada di bawah kendali subversi.
Catatan:
st
di svn st
adalah build-in alias untuk status
, yaitu perintah setara dengansvn status
--no-ignore
juga menyertakan file non-repositori dalam output status, jika tidak mengabaikan melalui mekanisme seperti .cvsignore
dll. - karena tujuannya adalah untuk memiliki titik awal yang bersih untuk build, sakelar ini adalah suatu keharusangrep
filter output sehingga hanya file yang tidak diketahui untuk subversi yang tersisa - garis dimulai dengan ?
daftar file yang tidak diketahui untuk subversi yang akan diabaikan tanpa --no-ignore
opsised
xargs
perintah diinstruksikan melalui -r
untuk tidak mengeksekusi rm
, ketika daftar argumen akan kosong-d '\n'
pilihan memberitahu xargs
untuk menggunakan baris baru sebagai pembatas perintah tersebut juga bekerja untuk nama file dengan spasirm -r
digunakan jika direktori lengkap (yang bukan bagian dari repositori) perlu dihapusSaya tidak bisa mendapatkan semua hal di atas untuk bekerja tanpa ketergantungan tambahan. Saya tidak ingin menambahkan ke sistem build otomatis saya di win32. Jadi saya mengumpulkan perintah Ant berikut - perhatikan ini memerlukan Ant-contrib JAR untuk diinstal (saya menggunakan versi 1.0b3, yang terbaru, dengan Ant 1.7.0).
Perhatikan ini menghapus semua file tidak berversi tanpa peringatan.
<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>
Untuk folder lain, ubah ${basedir}
referensinya.
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
hapus gema jika Anda yakin itu yang ingin Anda lakukan.
/bin/sh
dan n rm
proses bercabang.
Mungkin juga menyumbangkan opsi lain
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(Configi>.ini)/ untuk tujuan saya sendiri.
Dan mungkin ide yang bagus untuk menambahkan --no-ignore ke perintah svn
Saya tersandung pada svn-clean di mesin RH5 saya. Itu terletak di / usr / bin / svn-clean
http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean
Solusi cmd / bat windows murni:
@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
Saya sudah mencoba versi Seth Reno dari jawaban ini tetapi tidak berhasil untuk saya. Saya memiliki 8 karakter sebelum nama file, bukan 9 yang digunakan dalam cut -c9-
.
Jadi ini versi saya dengan sed
alih - alih cut
:
svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
Jika Anda keren dengan PowerShell:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
Keluarkan flag -WhatIf untuk membuat perintah benar-benar melakukan penghapusan. Jika tidak, itu hanya akan menampilkan apa yang akan dilakukannya jika dijalankan tanpa -WhatIf.
Saya akan menambahkan ini sebagai komentar untuk jawaban Thomas Watnedal , tetapi belum bisa.
Masalah kecil dengannya (yang tidak akan mempengaruhi Windows) adalah ia hanya memeriksa file atau direktori. Untuk sistem mirip Unix di mana tautan simbolik mungkin ada, perlu untuk mengubah baris:
if os.path.isfile(fullpath):
untuk
if os.path.isfile(fullpath) or os.path.islink(fullpath):
untuk juga menghapus tautan.
Bagi saya, mengubah baris terakhir if match: removeall(match.group(1))
menjadi
if match:
print "Removing " + match.group(1)
removeall(match.group(1))
sehingga menampilkan apa yang dihapusnya juga berguna.
Bergantung pada kasus penggunaan, ?[\?ID]
bagian dari ekspresi reguler mungkin lebih baik ?[\?I]
, karena D
juga menghapus file yang dihapus, yang berada di bawah kontrol versi. Saya ingin menggunakan ini untuk membangun di folder yang bersih dan sudah diperiksa, jadi seharusnya tidak ada file dalam D
keadaan.
@zhoufei Saya menguji jawaban Anda dan berikut adalah versi terbarunya:
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"
%
tanda di depan G dan H.%~1
dapat digunakan nama direktori apa pun, saya menggunakan ini sebagai fungsi dalam file bat, jadi %~1
parameter input pertamaUntuk orang-orang yang suka melakukan ini dengan perl, bukan python, Unix shell, java, dll. Dengan ini, skrip perl kecil yang juga melakukan jib.
Catatan: Ini juga menghapus semua direktori tidak berversi
#!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();
Menggunakan TortoiseSVN: * klik kanan pada folder copy pekerjaan, sambil menahan shift-key ke bawah * pilih "hapus item tidak berversi"
Cara bersih untuk melakukan ini di PERL adalah:
#!/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 ()
Saya menggunakan ~ 3 jam untuk menghasilkan ini. Diperlukan waktu 5 menit untuk melakukannya di Unix. Masalah utama adalah: spasi dalam nama untuk folder Win, ketidakmungkinan untuk mengedit %% i dan masalah dengan mendefinisikan vars di loop cmd Win.
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!
)
C # kode snipet di atas tidak bekerja untuk saya - Saya memiliki klien svn tortoise, dan baris diformat sedikit berbeda. Berikut adalah snipet kode yang sama seperti di atas, hanya ditulis ulang untuk berfungsi dan menggunakan 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