क्या किसी को काम की प्रतिलिपि में उन सभी फ़ाइलों को पुन: हटाने का एक तरीका पता है जो संस्करण नियंत्रण में नहीं हैं? (मुझे अपने स्वचालित बिल्ड VMware में अधिक विश्वसनीय परिणाम प्राप्त करने की आवश्यकता है।)
hg purge --all
मर्क्यूरियल में।
क्या किसी को काम की प्रतिलिपि में उन सभी फ़ाइलों को पुन: हटाने का एक तरीका पता है जो संस्करण नियंत्रण में नहीं हैं? (मुझे अपने स्वचालित बिल्ड VMware में अधिक विश्वसनीय परिणाम प्राप्त करने की आवश्यकता है।)
hg purge --all
मर्क्यूरियल में।
जवाबों:
संपादित करें:
सबवर्सन 1.9.0 ने ऐसा करने का एक विकल्प पेश किया:
svn cleanup --remove-unversioned
इससे पहले, मैं यह करने के लिए इस अजगर स्क्रिप्ट का उपयोग करता हूं:
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))
यह काम बहुत अच्छी तरह से करने लगता है।
svn cleanup --remove-unversioned
बेहतर है। और यह Subversion 1.9.0 के लिए है (यह संस्करण 2015 से है)। यह स्थिर और स्थिर है।
यह मेरे लिए काम करता है:
svn status | egrep '^\?' | cut -c8- | xargs rm
सेठ रेनो बेहतर है:
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
यह फ़ाइल नाम में असंबद्ध फ़ोल्डर और रिक्त स्थान को संभालता है
नीचे दी गई टिप्पणियों के अनुसार, यह केवल उन फाइलों पर काम करता है जो तोड़फोड़ के बारे में नहीं जानता (स्थिति =?)। कुछ भी तोड़फोड़ कि करता है (अनदेखा फ़ाइलें / फ़ोल्डर सहित) को हटाया नहीं जाएगा के बारे में पता है।
यदि आप 1.9 या अधिक तोड़फोड़ का उपयोग कर रहे हैं, तो आप केवल - क्लीनव-अनवेरेड और - वर्म-इग्नोर किए गए विकल्पों के साथ svn क्लीनअप कमांड का उपयोग कर सकते हैं।
svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
मैं इस पृष्ठ पर एक ही कार्य करते हुए देख रहा था, हालांकि एक स्वचालित निर्माण के लिए नहीं।
थोड़ा और देखने के बाद मैंने TortoiseSVN में ' विस्तारित संदर्भ मेनू ' की खोज की । शिफ्ट कुंजी दबाए रखें और काम की प्रतिलिपि पर राइट क्लिक करें। TortoiseSVN मेनू के अंतर्गत अब अतिरिक्त विकल्प हैं जिनमें ' हटाए गए आइटम हटाएं ... ' शामिल हैं।
हालांकि शायद इस विशिष्ट प्रश्न के लिए लागू नहीं है (यानी एक स्वचालित निर्माण के संदर्भ में), मैंने सोचा कि यह दूसरों के लिए एक ही काम करने में मददगार हो सकता है।
यदि आप विंडोज़ कमांड लाइन पर हैं,
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"
मैंने इसे अपनी विंडो के साथ जोड़ा है शख्सियत प्रोफाइल
function svnclean {
svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}
--no-ignore
करने के लिए svn status
और -Recurse
करने के लिएRemove-Item
लिनक्स कमांड लाइन:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r
या, यदि आपकी कुछ फाइलें रूट के स्वामित्व में हैं:
svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r
यह केन के जवाब पर आधारित है। (केन के जवाब ने फाइलों को नजरअंदाज कर दिया; मेरा जवाब उन्हें मिटा देता है)।
यदि आपके पास अपने रास्ते पर TortoiseSVN है और आप सही निर्देशिका में हैं:
TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui
विकल्प के लिए TortoiseSVN मदद में वर्णित हैं /command:cleanup
:
परिणाम संवाद को पॉपअप करने से रोकने के लिए / noui का उपयोग करें या तो सफाई समाप्त होने या त्रुटि संदेश दिखाने के बारे में बताएं)। / noprogressui भी प्रगति संवाद को अक्षम करता है। / nodlg सफाई डायलॉग दिखाने में अक्षम करता है, जहां उपयोगकर्ता यह चुन सकता है कि वास्तव में सफाई में क्या किया जाना चाहिए। उपलब्ध कार्यों को स्टेटस क्लीनअप, / रिवर्ट, / डेल्यूवर्नडेड, / डेलिनगार्ड, / रिफ्रेश और / एक्सटर्नल के विकल्प / सफाई के साथ निर्दिष्ट किया जा सकता है।
यदि आप कछुआ svn का उपयोग कर रहे हैं तो ऐसा करने के लिए एक छिपा हुआ आदेश है। विंडोज़ एक्सप्लोरर में संदर्भ मेनू लॉन्च करने के लिए फ़ोल्डर पर राइट क्लिक करते हुए शिफ्ट होल्ड करें। आपको "हटाए गए असूचीबद्ध आइटम" कमांड मिलेगी।
विवरण के लिए इस पृष्ठ के निचले भाग को देखें, या नीचे का स्क्रीन शॉट जिसमें हरे सितारों के साथ विस्तारित विशेषताएं हैं, और पीले आयत के साथ ब्याज की एक ...
तोड़फोड़ 1.9.0 प्रस्तुत न किए गए आइटम को हटाने के लिए विकल्प प्रस्तुत किया [1]
svn cleanup --remove-unversioned
[१] https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
मेरा सी # थॉमस वॉटरडेल्स पायथन लिपि का रूपांतरण:
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
यह सभी फ़ाइलों को तोड़फोड़ नियंत्रण में नहीं हटाने के लिए एक यूनिक्स शेल कमांड है।
टिप्पणियाँ:
st
, के svn st
लिए एक निर्माण में उपनाम है status
, यानी कमांड के बराबर हैsvn status
--no-ignore
स्टेटस आउटपुट में नॉन-रिपॉजिटरी फाइल्स को भी शामिल करता है, अन्यथा .cvsignore
आदि जैसे तंत्र के माध्यम से नजरअंदाज करता है - चूंकि इस स्विच को बनाने के लिए लक्ष्य एक साफ-सुथरा शुरुआती बिंदु हैgrep
तोड़फोड़ करने के लिए फिल्टर ऐसी है कि उत्पादन केवल अज्ञात फ़ाइलें छोड़ दिया जाता है - लाइनों के साथ शुरुआत ?
है कि बिना नजरअंदाज कर दिया जाएगा तोड़फोड़ करने के लिए सूची फ़ाइलें अज्ञात --no-ignore
विकल्पsed
xargs
आदेश के माध्यम से निर्देश दिया जाता है -r
पर अमल नहीं करने के लिए rm
, जब तर्क सूची खाली होगा-d '\n'
विकल्प बताता है xargs
के रूप में इस तरह के सीमांकक आदेश भी रिक्त स्थान के साथ फ़ाइल नामों के लिए काम करता है एक नई पंक्ति का उपयोग करने केrm -r
पूर्ण निर्देशिकाओं में उपयोग किया जाता है (जो कि भंडार का हिस्सा नहीं हैं) को हटाने की आवश्यकता हैमुझे अतिरिक्त निर्भरता के बिना काम करने के लिए उपरोक्त में से कोई भी नहीं मिल सकता है जिसे मैं win32 पर अपने स्वचालित निर्माण प्रणाली में जोड़ना नहीं चाहता था। इसलिए मैंने निम्नलिखित चींटी कमांड्स को एक साथ रखा - ध्यान दें कि इनमें एंट-कॉन्ट्रिब JAR की आवश्यकता होती है (मैं संस्करण 1.0b3 का उपयोग कर रहा था, नवीनतम चींटी 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 "${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>
एक अलग फ़ोल्डर के लिए, ${basedir}
संदर्भ बदलें ।
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'
यदि यह सुनिश्चित हो कि आप क्या करना चाहते हैं, तो प्रतिध्वनि को हटा दें।
/bin/sh
और n rm
प्रक्रियाएँ हैं।
साथ ही एक और विकल्प का योगदान कर सकते हैं
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(Configpg.ini)/ मेरे अपने उद्देश्यों के लिए है।
और svn कमांड को जोड़ने के लिए एक अच्छा विचार हो सकता है
मैं अपने आरएच 5 मशीन पर svn-clean पर ठोकर खाई। / Usr / bin / svn-clean पर स्थित है
http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean
शुद्ध खिड़कियां cmd / बैट समाधान:
@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
मैंने इस जवाब से सेठ रेनो के संस्करण की कोशिश की है, लेकिन यह मेरे लिए काम नहीं किया। मैं फ़ाइल नाम से पहले 8 अक्षर था, 9 में इस्तेमाल नहीं कियाcut -c9-
।
तो sed
इसके बजाय यह मेरा संस्करण है cut
:
svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r
यदि आप पॉवरशेल से शांत हैं:
svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }
कमांड को वास्तव में डिलीट करने के लिए -WhatIf फ्लैग को बाहर निकालें। अन्यथा यह सिर्फ उत्पादन होगा अगर यह क्या करता है -WhatIf के बिना चलाते हैं।
मैं इसे थॉमस वात्सल के उत्तर के लिए एक टिप्पणी के रूप में जोड़ूंगा , लेकिन अभी तक नहीं।
इसके साथ एक छोटी सी समस्या (जो विंडोज को प्रभावित नहीं करेगी) यह है कि यह केवल फाइलों या निर्देशिकाओं के लिए जाँच करता है। यूनिक्स जैसी प्रणालियों के लिए जहां प्रतीकात्मक लिंक मौजूद हो सकते हैं, लाइन को बदलना आवश्यक है:
if os.path.isfile(fullpath):
सेवा
if os.path.isfile(fullpath) or os.path.islink(fullpath):
लिंक हटाने के लिए।
मेरे लिए, अंतिम पंक्ति को if match: removeall(match.group(1))
में बदलना
if match:
print "Removing " + match.group(1)
removeall(match.group(1))
ताकि यह प्रदर्शित हो कि यह क्या हटा रहा है उपयोगी था।
उपयोग के मामले के आधार पर, ?[\?ID]
नियमित अभिव्यक्ति का हिस्सा बेहतर हो सकता है ?[\?I]
, क्योंकि D
यह हटाए गए फ़ाइलों को भी हटाता है, जो संस्करण नियंत्रण में थे। मैं इसे एक साफ, चेक किए गए फ़ोल्डर में बनाने के लिए उपयोग करना चाहता हूं, इसलिए एक D
राज्य में कोई फाइल नहीं होनी चाहिए ।
@ झोउफ़ेई मैं आपके जवाब का परीक्षण किया है और यहाँ अद्यतन संस्करण है:
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
किसी भी निर्देशिका नाम का उपयोग किया जा सकता है, मैंने इसे एक बैट फ़ाइल में एक फ़ंक्शन के रूप में उपयोग किया है, इसलिए %~1
पहला इनपुट पैरामटर हैउन लोगों के लिए जो अजगर, यूनिक्स खोल, जावा, आदि के बजाय पर्ल के साथ ऐसा करना पसंद करते हैं। इसके अलावा एक छोटी सी पर्ल स्क्रिप्ट है जो जिब को भी करती है।
नोट: यह भी सभी अप्रकाशित निर्देशिकाओं को हटा देता है
#!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 का उपयोग करना: * शिफ्ट-की को दबाए रखते हुए काम करने वाले फ़ोल्डर पर राइट-क्लिक करें * "अनवांटेड आइटम हटाएं" चुनें
मैं अपनी कार्यशील प्रतिलिपि में सभी असूचीबद्ध / उपेक्षित फ़ाइलों / फ़ोल्डरों को कैसे हटा सकता हूं?
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 ()
इसे बनाने के लिए मैंने ~ 3 घंटे का उपयोग किया। यूनिक्स में इसे करने के लिए 5 मिनट लगेंगे। मुख्य मुद्दे थे: विन फ़ोल्डरों के लिए नाम में रिक्त स्थान, %% i को संपादित करने की असंभवता और विन सेमीफाइनल लूप में वार्निंग को परिभाषित करने की समस्या।
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 # कोड स्निपेट ऊपर मेरे लिए काम नहीं किया - मेरे पास कछुआ svn ग्राहक है, और लाइनों को थोड़ा अलग तरीके से स्वरूपित किया गया है। यहाँ ऊपर के समान कोड स्निपेट है, केवल 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