Có ai biết một cách để loại bỏ đệ quy tất cả các tệp trong một bản sao đang hoạt động không được kiểm soát phiên bản không? (Tôi cần điều này để có được kết quả đáng tin cậy hơn trong VMware xây dựng tự động của mình.)
hg purge --all
ở Mercurial.
Có ai biết một cách để loại bỏ đệ quy tất cả các tệp trong một bản sao đang hoạt động không được kiểm soát phiên bản không? (Tôi cần điều này để có được kết quả đáng tin cậy hơn trong VMware xây dựng tự động của mình.)
hg purge --all
ở Mercurial.
Câu trả lời:
Biên tập:
Subversion 1.9.0 đã giới thiệu một tùy chọn để thực hiện việc này:
svn cleanup --remove-unversioned
Trước đó, tôi sử dụng tập lệnh python này để làm điều đó:
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))
Nó dường như làm công việc khá tốt.
svn cleanup --remove-unversioned
là tốt hơn. Và nó dành cho Subversion 1.9.0 (phiên bản này có từ năm 2015). Nó ổn định và đứng vững.
điều này làm việc cho tôi trong bash:
svn status | egrep '^\?' | cut -c8- | xargs rm
Seth Reno 's tốt hơn:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Nó xử lý các thư mục và không gian không phiên bản trong tên tệp
Theo nhận xét bên dưới, điều này chỉ hoạt động trên các tệp mà lật đổ không biết về (trạng thái =?). Bất cứ điều gì mà lật đổ không biết về (bao gồm Ignored file / folder) sẽ không bị xóa.
Nếu bạn đang sử dụng subversion 1.9 trở lên, bạn có thể chỉ cần sử dụng lệnh dọn dẹp svn với các tùy chọn --remove-unversions và --remove-bỏ qua
svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
Tôi đã lướt qua trang này trong khi tìm cách làm điều tương tự, mặc dù không phải cho một bản dựng tự động.
Sau khi xem xét kỹ hơn một chút, tôi đã phát hiện ra ' Menu ngữ cảnh mở rộng ' trong TortoiseSVN. Giữ phím shift và nhấp chuột phải vào bản sao đang làm việc. Hiện có các tùy chọn bổ sung trong menu TortoiseSVN bao gồm ' Xóa các mục chưa phiên bản ... '.
Mặc dù có lẽ không áp dụng được cho câu hỏi cụ thể này (tức là trong ngữ cảnh của một bản dựng tự động), tôi nghĩ rằng nó có thể hữu ích cho những người khác muốn làm điều tương tự.
Nếu bạn đang sử dụng dòng lệnh windows,
for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i
Phiên bản cải tiến:
for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%i %j"
Nếu bạn sử dụng điều này trong một tệp hàng loạt, bạn cần phải tăng gấp đôi %
:
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn delete --force "%%i %%j"
Tôi đã thêm cái này vào hồ sơ windows powershell của mình
function svnclean {
svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
--no-ignore
vào svn status
và -Recurse
đểRemove-Item
Dòng lệnh Linux:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
Hoặc, nếu một số tệp của bạn thuộc sở hữu của người chủ:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
Điều này dựa trên câu trả lời của Ken. (Câu trả lời của Ken bỏ qua các tệp bị bỏ qua; câu trả lời của tôi sẽ xóa chúng).
Chỉ cần làm điều đó trên unix-shell với:
rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`
Bạn có thể không chỉ thực hiện xuất sang một vị trí mới và xây dựng từ đó?
Nếu bạn có TortoiseSVN trên đường dẫn của mình và bạn đang ở đúng thư mục:
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
Các tùy chọn được mô tả trong phần trợ giúp TortoiseSVN cho /command:cleanup
:
Sử dụng / noui để ngăn hộp thoại kết quả bật lên cho biết quá trình dọn dẹp đã hoàn tất hoặc hiển thị thông báo lỗi). / noprogressui cũng vô hiệu hóa hộp thoại tiến trình. / gật đầu tắt hiển thị hộp thoại dọn dẹp nơi người dùng có thể chọn chính xác những gì nên thực hiện trong quá trình dọn dẹp. Các hành động có sẵn có thể được chỉ định với các tùy chọn / dọn dẹp để dọn dẹp trạng thái, / hoàn nguyên, / xóa phiên bản, / xóa dấu, / làm mới và / bên ngoài.
Nếu bạn đang sử dụng rùa svn thì có một lệnh ẩn để thực hiện việc này. Giữ phím shift trong khi nhấp chuột phải vào thư mục để khởi chạy menu ngữ cảnh trong windows explorer. Bạn sẽ nhận được lệnh "Xóa các mục chưa được phiên bản".
xem chi tiết ở cuối trang này hoặc ảnh chụp màn hình bên dưới làm nổi bật các đối tượng địa lý mở rộng với các ngôi sao màu xanh lá cây và đối tượng quan tâm có hình chữ nhật màu vàng ...
Subversion 1.9.0 đã giới thiệu tùy chọn để xóa các mục chưa phiên bản [1]
svn cleanup --remove-unversioned
[1] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
Chuyển đổi C # của tôi về tập lệnh Python Thomas Watnedals:
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
Đây là một lệnh unix shell để xóa tất cả các tệp không thuộc quyền kiểm soát của lật đổ.
Ghi chú:
st
trong svn st
là một build-in bí danh cho status
, tức là lệnh tương đương vớisvn status
--no-ignore
cũng bao gồm các tệp không phải kho lưu trữ trong đầu ra trạng thái, nếu không sẽ bỏ qua qua các cơ chế như .cvsignore
v.v. - vì mục tiêu là có một điểm khởi đầu rõ ràng cho các bản dựng, chuyển đổi này là phảigrep
bộ lọc đầu ra sao cho chỉ còn lại các tệp không xác định đối với bản lật ngược - các dòng bắt đầu bằng ?
danh sách các tệp không xác định với bản lật ngược sẽ bị bỏ qua nếu không có --no-ignore
tùy chọnsed
xargs
lệnh được hướng dẫn qua -r
để không thực hiện rm
, khi danh sách đối số sẽ được sản phẩm nào-d '\n'
tùy chọn bảo xargs
sử dụng một dòng mới như delimiter lệnh như vậy cũng làm việc cho tên tập tin với không gianrm -r
được sử dụng trong trường hợp các thư mục hoàn chỉnh (không phải là một phần của kho lưu trữ) cần được xóaTôi không thể làm cho bất kỳ điều nào ở trên hoạt động mà không có phụ thuộc bổ sung mà tôi không muốn phải thêm vào hệ thống xây dựng tự động của mình trên win32. Vì vậy, tôi đã tập hợp các lệnh Ant sau đây - lưu ý rằng các lệnh này yêu cầu phải cài đặt Ant-Contrib JAR (Tôi đang sử dụng phiên bản 1.0b3, phiên bản mới nhất, với Ant 1.7.0).
Lưu ý rằng điều này sẽ xóa tất cả các tệp không phiên bản mà không có cảnh báo.
<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>
Đối với một thư mục khác, hãy thay đổi ${basedir}
tham chiếu.
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
loại bỏ tiếng vọng nếu đó chắc chắn là điều bạn muốn làm.
/bin/sh
và n rm
quá trình được chia nhỏ.
Cũng có thể đóng góp một phương án khác
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(Config|.ini)/ là dành cho mục đích của riêng tôi.
Và có thể là một ý tưởng hay khi thêm --no-ignore vào lệnh svn
Tôi vấp phải svn-clean trên máy RH5 của mình. Nó được đặt tại / usr / bin / svn-clean
http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean
Giải pháp cmd / bat cửa sổ tinh khiết:
@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
Tôi đã thử phiên bản của Seth Reno từ câu trả lời này nhưng nó không hiệu quả với tôi. Tôi đã có 8 ký tự trước tên tệp, không phải 9 ký tự được sử dụng trong cut -c9-
.
Vì vậy, đây là phiên bản của tôi với sed
thay vì cut
:
svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
Nếu bạn thấy thú vị với powershell:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
Lấy cờ -WhatIf ra để lệnh thực sự thực hiện việc xóa. Nếu không, nó sẽ chỉ xuất ra những gì nó sẽ làm nếu chạy mà không có -WhatIf.
Tôi sẽ thêm điều này làm bình luận cho câu trả lời của Thomas Watnedal , nhưng chưa thể.
Một vấn đề nhỏ với nó (sẽ không ảnh hưởng đến Windows) là nó chỉ kiểm tra các tệp hoặc thư mục. Đối với các hệ thống Unix giống như các liên kết tượng trưng có thể có, cần phải thay đổi dòng:
if os.path.isfile(fullpath):
đến
if os.path.isfile(fullpath) or os.path.islink(fullpath):
để xóa các liên kết.
Đối với tôi, thay đổi dòng cuối cùng if match: removeall(match.group(1))
thành
if match:
print "Removing " + match.group(1)
removeall(match.group(1))
để nó hiển thị những gì nó đang xóa cũng hữu ích.
Tùy thuộc vào trường hợp sử dụng, ?[\?ID]
một phần của biểu thức chính quy có thể tốt hơn như ?[\?I]
, như D
cũng loại bỏ các file bị xóa, mà là dưới sự kiểm soát phiên bản. Tôi muốn sử dụng nó để xây dựng trong một thư mục đã kiểm tra, sạch sẽ, vì vậy không có tệp nào ở D
trạng thái.
@zhoufei Tôi đã kiểm tra câu trả lời của bạn và đây là phiên bản cập nhật:
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"
%
dấu trước G và H%~1
có thể sử dụng bất kỳ tên thư mục nào, tôi đã sử dụng tên này như một hàm trong tệp bat, thông số %~1
đầu vào đầu tiên cũng vậyNếu bạn không muốn viết bất kỳ mã nào, svn2.exe từ svn2svn sẽ thực hiện điều này, cũng có một bài viết về cách nó được triển khai. Các thư mục và tệp đã xóa được bỏ vào thùng rác.
Chạy "svn2.exe sync [path]".
Đối với những người thích làm điều này với perl thay vì python, Unix shell, java, v.v. Đây là một tập lệnh perl nhỏ cũng thực hiện jib.
Lưu ý: Thao tác này cũng xóa tất cả các thư mục chưa được phiên bản
#!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();
Sử dụng TortoiseSVN: * nhấp chuột phải vào thư mục sao chép đang làm việc, trong khi giữ phím shift * chọn "xóa các mục chưa phiên bản"
Một cách rõ ràng để làm điều này trong PERL sẽ là:
#!/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 ()
Tôi đã sử dụng ~ 3 giờ để tạo ra cái này. Sẽ mất 5 phút để làm điều đó trong Unix. Vấn đề chính là: khoảng trắng trong tên cho các thư mục Win, không thể chỉnh sửa %% i và vấn đề với việc xác định các vars trong vòng lặp 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!
)
Đoạn mã C # ở trên không hoạt động với tôi - Tôi có ứng dụng khách svn rùa và các dòng được định dạng hơi khác. Đây là đoạn mã tương tự như trên, chỉ được viết lại để hoạt động và sử dụng 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